From: Han-Wen Nienhuys <hanwen@xs4all.nl> Date: Fri, 14 Aug 1998 11:24:46 +0000 (+0200) Subject: release: 1.0.2 X-Git-Tag: release/1.0.2 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=a3a44f9f3c581b6824b3a65f9039656693e09bbf;p=lilypond.git release: 1.0.2 --- diff --git a/AUTHORS.txt b/AUTHORS.txt index ebf1db1135..7dd6318284 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -17,7 +17,7 @@ o Jan Arne Fagertun <Jan.A.Fagertun@energy.sintef.no>, o Anthony Fok <foka@debian.org>, debian package: debian/* o Neil Jerram <nj104@cus.cam.ac.uk>. - Documentation/Vocab* + parts of Documentation/Vocab* o Donald Ervin Knuth, http://www.cs-staff.stanford.edu/~knuth mf/ital-*.mf (these were taken from the CM fonts) o Werner Lemberg <xlwy01@uxp1.hrz.uni-dortmund.de>, @@ -29,14 +29,14 @@ o Han-Wen Nienhuys <hanwen@cs.uu.nl>, Main author. o Jan Nieuwenhuizen <janneke@gnu.org>, - http://www.digicash.com/~jan + http://www.xs4all.nl/~jantien Main author o Alexandre Oliva <oliva@dcc.unicamp.br>, http://sunsite.unicamp.br/~oliva testing o Franc,ois Pinard <pinard@iro.umontreal.ca>, - Documentation/Vocab*, started internationalization stuff + parts of Documentation/Vocab*, started internationalization stuff o Jeffrey B. Reed <daboys@bga.com>, Windows-NT support. o Shay Rojanski diff --git a/Documentation/faq.yo b/Documentation/faq.yo index 968fbb6b3f..14dbafd856 100644 --- a/Documentation/faq.yo +++ b/Documentation/faq.yo @@ -253,15 +253,19 @@ doubt if a simple-minded approach (dragging and dropping notes) is any easier or quicker to use than mudela. But for composing a graphical environment probably is indispensable. -In any case email(Derek Wyatt)(wyatt@?.edu) is working on embryonal GTK -based editor. There also a GUI package RoseGarden that could be -extended to output mudela. +In any case email(Derek Wyatt)(wyatt@scar.utoronto.edu) is working on +GTK based editor, but that is still in an embryonal stage (see +lurl(http://harmonia.scar.utoronto.ca). There is also a GUI package +RoseGarden that could be extended to output mudela. + +If you want to work on this, please send e-mail to the mailing list +email(gnu-misc-discuss@gnu.org). question(I want to implement XXXX! How should I do this?) -Your best bet of getting me to include code, is to present it as a -"fait accompli", i.e., to send me a patch. +Your best bet of getting us to include code, is to present it as a +"fait accompli", i.e., to send a patch to the mailing list. question(I made some code, how do I get you to include it?) diff --git a/Documentation/man/Makefile b/Documentation/man/Makefile index a3157a3eb9..1460196b88 100644 --- a/Documentation/man/Makefile +++ b/Documentation/man/Makefile @@ -13,7 +13,9 @@ MANGROFF = $(addprefix $(outdir)/, $(addsuffix .$(SECTION),$(basename $(YO_FILES OUTTEXINFO_FILES= $(addprefix $(outdir)/, $(addsuffix .texinfo,$(basename $(YO_FILES) .yo))) -default: $(MANTXT) $(MANGROFF) +OUT_DIST_FILES += $(MANGROFF) + +default: $(MANGROFF) texinfo: $(OUTTEXINFO_FILES) diff --git a/Documentation/man/out/convert-mudela.1 b/Documentation/man/out/convert-mudela.1 new file mode 100644 index 0000000000..a72de5e538 --- /dev/null +++ b/Documentation/man/out/convert-mudela.1 @@ -0,0 +1,45 @@ +.TH "convert-mudela" "1" "1998" "The LilyPond package" "convert-mudela" +.PP +.PP +.SH "NAME" +convert-mudela \- convert-mudela to newer versions +.PP +convert-mudela sequentially applies different mudela-conversions to +upgrade a Mudela input file\&. +.PP +.PP +.SH "DESCRIPTION" +.PP +Upgrade a Mudela input file from FROM_PATCHLEVEL to TO_PATCHLEVEL\&. +If no files are given, the standard input and output are used\&. +.PP +.SH "SYNOPSIS" +.PP +convert-mudela [options] [files] +.PP +.SH "OPTIONS" +.IP "--output" +The output file to write +.IP "--edit" +Do an inline edit of the input file\&. override @samp{--output} +.IP "--show-rules" +shows all known conversions, and exit +.IP "--from=FROM_PATCHLEVEL" +Set the level to convert from\&. If this is not set, convert-mudela will +guess this, on the basis of \f(CW\eversion\fP strings in the file +.IP "--to=TO_PATCHLEVEL" +Set the goal version of the conversion\&. It defaults to the latest +available version\&. +.PP +.SH "BUGS" +.PP +Not all language changes are handled\&. Multiple output options won\'t +work\&. +.PP +convert-mudela is written in python, so you have install +python\&. +.PP +.SH "AUTHOR" +.PP +Han-Wen Nienhuys <hanwen@cs\&.uu\&.nl>, http://www\&.cs\&.uu\&.nl/people/hanwen +.PP diff --git a/Documentation/man/out/lilypond.1 b/Documentation/man/out/lilypond.1 new file mode 100644 index 0000000000..85af901fd9 --- /dev/null +++ b/Documentation/man/out/lilypond.1 @@ -0,0 +1,223 @@ +.TH "LilyPond" "1" "1998" "The LilyPond package" "The GNU Project Music Typesetter" +.PP +.PP +.SH "NAME" +LilyPond \- the GNU Music Typesetter +.PP +.PP +.PP +.SH "SYNOPSIS" +\fBlilypond\fP [OPTION]\&.\&.\&. [MUDELA-FILE]\&.\&.\&. +.PP +.SH "DESCRIPTION" +.PP + +.DS + +LilyPond is the GNU Project music typesetter\&. This program can print +beautiful sheet music from a music definition file\&. It can also play +mechanical performances to a MIDI file\&. Features include multiple +staffs, meters, clefs, keys, lyrics, versatile input language, cadenzas, +beams, slurs, triplets, formatting scores, part extraction\&. It includes +a nice font of musical symbols\&. + +.DE + + +.PP +.SH "OPTIONS" +.IP "-I,--include=FILE" +add \fBFILE\fP to the search path for input files\&. +.IP "-M,--midi" +This disables TeX output\&. If you have a \emidi definition, it will do the +midi output only\&. +.IP "-d,--dependencies" +Also output rules to be included in Makefile\&. +.IP "-D,--debug" +Turn debugging info on\&. GNU LilyPond reads the file \fB\&.dstreamrc\fP, +which lists what functions and classes may produce copious debugging +output\&. +.IP "-t,--test" +Switch on any experimental features\&. Not for general public use\&. +.IP "-w,--warranty" +Show the warranty with which GNU LilyPond comes\&. (It comes with +\fBNO WARRANTY\fP!) +.IP "-o,--output=FILE" +Set the default output file to \fBFILE\fP\&. +.IP "-h,--help" +Show a summary of usage\&. +.IP "-i,--init=FILE" +Set init file to \fBFILE\fP (default: \fBinit\&.ly\fP)\&. +.IP "--include, -I=DIRECTORY" +Add \fBDIRECTORY\fP to the search path for input files\&. +.IP "--ignore-version, -V" +Make incompatible mudela version non-fatal\&. +.IP "--find-fourths, -Q" +Warn about melodic intervals larger than a fourth\&. Useful for +converting absolute octave mode stuff to relative octaves\&. +.PP +.SH "FEATURES" +.PP +This is an overview of the features that GNU LilyPond supports\&. For +details on how to use them, you should consult the Mudela tutorial, +which is included with the package\&. +.PP +.IP o +ASCII script input, with identifiers (for music reuse), +customizable notenames, customisable fontset\&. +.IP o +MIDI output lets you check if you have entered the correct notes\&. +.IP o +MIDI to Mudela conversion through the mi2mu program\&. +.IP o +Multiple staffs in one score\&. Each staff can have different meters\&. +.IP o +Beams, slurs, ties, chords, super/subscripts (accents and text) +triplets, general n-plet (triplet, quadruplets, etc\&.), lyrics, +transposition dynamics (both absolute and hairpin style)\&. +.IP o +Multiple voices within one staff; beams optionally shared +between voices\&. Up to four voices is handled cleanly\&. +.IP o +Multiple scores within one input file\&. Each score is output to +a different file\&. +.IP o +Clef changes, meter changes, cadenza-mode, key changes, repeat bars\&. +.PP +.SH "DISCLAIMER" +.PP +GNU LilyPond is copyright 1996-1998 by its authors\&. GNU LilyPond is +distributed under the terms of the GNU General Public License\&. GNU LilyPond +is provided without any warranty what so ever\&. +GNU LilyPond may be freely distributed\&. For further information consult +the GNU General Public License, from the file \fBCOPYING\fP\&. +.PP +.SH "PROBLEMS" +.PP +There is an extensive list of todoes and bugs\&. See \fBTODO\fP\&. If you +have a problem you should try to find out +.PP +.IP o +If the bug has been fixed in a newer release\&. +.IP o +If the bug has been found earlier, consult \fBTODO\fP and \fBBUGS\fP\&. +.PP +If you have found a bug, then you should send a bugreport\&. +.PP +.IP o +Send a copy of the input which causes the error\&. +.IP o +Send a description of the platform you use\&. +.IP o +Send a description of the LilyPond version you use +(with compile/configure options please)\&. +.IP o +Send a description of the bug itself\&. +.IP o +Send it to bug-gnu-music@gnu\&.org <bug-gnu-music@gnu\&.org> (you don\'t have to subscribe +to this mailinglist)\&. +.PP +.SH "FILES" +.IP "\fBinit\&.ly\fP" +The initialisation file with symbol tables etc\&. It +includes files from the directory \fBinit/\fP\&. +.PP +manspagesection(environment) +.PP +.IP "LILYINCLUDE" +additional directories for finding lilypond data\&. The +format is like the format of \fBPATH\fP\&. +.IP "LANG" +selects the language for the warning messages of LilyPond\&. +.PP +.SH "BUGS" +.PP +Lots of them\&. See \fBTODO\fP and \fBBUGS\fP +.PP +.SH "SEE ALSO" +.PP +.IP "internals" +On technical details of LilyPond +.IP "mudela-man" +On the input format\&. This is a LilyPond-enhanced LaTeX document\&. +.IP "MANIFESTO" +Goals of the GNU LilyPond project\&. +.IP "FAQ" +The GNU LilyPond FAQ list +.IP "GNU LilyPond" +has her own webpage\&. This webpage contains the MIDI, GIF and PS files for +some standard music files\&. It also has the complete LilyPond documentation +.PP +GNU LilyPond is +updated very frequently, the latest version is always available at: +ftp://pcnov095\&.win\&.tue\&.nl/pub/lilypond\&. This FTP site is mirrored +at a number of sites; consult the project web pages for information +about mirrors\&. +.PP +For programs which are part of the GNU music project, the following +mailing list have been setup: +.PP +.IP "info-gnu-music@gnu\&.org <info-gnu-music@gnu\&.org>" +For information on the GNU Music project, to subscribe: send mail with +subject "subscribe" to info-gnu-music-request@gnu\&.org <info-gnu-music-request@gnu\&.org> +.IP "help-gnu-music@gnu\&.org <help-gnu-music@gnu\&.org>" +For help with programs from the GNU music project\&. To subscribe: send +mail with subject "subscribe" to help-gnu-music-request@gnu\&.org <help-gnu-music-request@gnu\&.org> +.IP "bug-gnu-music@gnu\&.org <bug-gnu-music@gnu\&.org>" +If you have bugreports, you should send them to this list\&. If you want +to read all bugreports, you should subscribe to this list\&. To +subscribe: send mail with subject "subscribe" to +bug-gnu-music-request@gnu\&.org <bug-gnu-music-request@gnu\&.org> +.IP "gnu-music-discuss@gnu\&.org <gnu-music-discuss@gnu\&.org>" +For discussions concerning the GNU Music project, to subscribe: send +mail with subject "subscribe" to +gnu-music-discuss-request@gnu\&.org <gnu-music-discuss-request@gnu\&.org> +.PP +Announces of new versions will be sent to info-gnu-music and +gnu-music-discuss\&. +.PP +.SH "REMARKS" +.PP +GNU LilyPond has no connection with the music package Rosegarden, other +than the names being similar (:-) +.PP +.SH "HISTORY" +.PP +(for a detailed changelog, see \fBNEWS\fP) +.PP +GNU LilyPond\'s roots lie in MPP, a preprocessor to the rather arcane +MusiXTeX macro package for TeX\&. A friend of mine, Jan Nieuwenhuizen +wrote the first 44 versions (0\&.01 to 0\&.44), then his program caught my +attention, and I was slowly sucked in to the interesting problem of +easily producing beautifully printed music\&. I contributed some +code\&. We soon realised that MPP\'s design was too fundamentally broken +to be repaired, so it was decided to rewrite MPP\&. We debated a lot about +the requirements to an inputformat (fall 1995)\&. I sat down and started +with a parser-first, bottom-up rewrite called mpp95 (which totally +failed, obviously)\&. +.PP +After long and hard thinking, I came up with an algorithm for the +horizontal spacing of multiple staffs (april 1996) I coded it (and did +not test it)\&. After starting with this fundamental piece, I slowly +added the stages which come before spacing, and after\&. A half year +later, I had a first working version, (october 1996)\&. I announced +Patchlevel 0\&.0\&.7 (or 8) to the mutex list after asking some technical +details on spacing; it was downloaded approximately 4 times\&. Then I +got the hang of it, and in the subsequent two months, I coded until it +had doubled in size (pl 23)\&. +.PP +Most the other history is described in the NEWS file\&. The first large +scale release (0\&.1) was done after approximately 78 patchlevels on +August 1, 1997\&. +.PP +.SH "AUTHOR" +.PP +Please consult the documentation file \fBAUTHORS\&.txt\fP for more detailed +information, and small contributions\&. +.PP +.IP o +Han-wen Nienhuys <hanwen@cs\&.uu\&.nl> +http://www\&.cs\&.uu\&.nl/people/hanwen +.IP o +Jan Nieuwenhuizen <janneke@gnu\&.org> +http://www\&.xs4all\&.nl/~jantien diff --git a/Documentation/man/out/ly2dvi.1 b/Documentation/man/out/ly2dvi.1 new file mode 100644 index 0000000000..dd83e906de --- /dev/null +++ b/Documentation/man/out/ly2dvi.1 @@ -0,0 +1,168 @@ +.TH "LilyPond" "1" "1998" "The LilyPond package" "Ly2dvi" +.PP +.PP +.SH "NAME" +Ly2dvi \- convert mudela to DVI +.PP +.PP +.SH "DESCRIPTION" +ly2dvi is a shell script which creates input file for LaTeX, +based on information from the output files from lilypond\&. +The script handles multiple files\&. If a mudela file name is +specified lilypond is run to make an output (TeX) file\&. +.PP +One or more LaTeX files are created, based on information found +in the output (TeX) files, and latex is finally run to create +one or more DVI files\&. +.PP +.SH "SYNOPSIS" +.PP +ly2dvi [options] inputfile[\&.ly] [\&.\&.\&.\&.] +.PP +.SH "OPTIONS" +.PP +.IP "-D,--debug" +Set debug mode\&. There are two levels - in level one some debug +info is written, in level two the command \fBset -x\fP is run, which +echoes every command in the ly2dvi script\&. +.IP "-F,--headers=" +Name of additional LaTeX headers file\&. This is included in the +tex file at the end of the headers, last line before \f(CW\ebegin{document}\fP +.IP "-H,--Heigth=" +Set paper heigth (points)\&. Used together with width and LaTeX name of +papersize in case of papersize unknown to ly2dvi\&. +.IP "-F,--headers=" +Name of additional LaTeX headers file\&. This is included in the +tex file at the end of the headers, last line before \f(CW\ebegin{document}\fP +.IP "-K,--keeplilypond" +Keep LilyPond output after the run\&. +.IP "-L,--landscape" +Set landscape orientation - portrait is the default\&. +(\fB-L\fP produces \f(CW\eusepackage[landscape]{article}\fP) +.IP "-N,--nonumber" +Switch off page numbering\&. +.IP "-O,--orientation=" +Set orientation landscape - obsolete, use \fB-L\fP instead\&. +.IP "-W,--Width=" +Set paper width (points)\&. Used together with heigth and LaTeX name of +papersize in case of papersize unknown to ly2dvi\&. +.IP "-d,--dependencies" +Tell lilypond to make dependencies file\&. +.IP "-h,--help" +Print help\&. +.IP "-k,--keeply2dvi" +Keep the LaTeX file after the run\&. +.IP "-l,--language=" +Specify LaTeX language\&. +(\fB-l norsk\fP produces \f(CW\eusepackage[norsk]{babel}\fP)\&. +.IP "-o,--output=" +Set output directory\&. +.IP "-p,--papersize=" +Specify papersize\&. +(\fB-p a4\fP produces \f(CW\eusepackage[a4paper]{article}\fP) +.IP "-s,--separate" +Normally all output files are included into one LaTeX file\&. +With this switch all files are run separately, to produce one +DVI file for each\&. +.PP +.SH "Features" +.PP +ly2dvi responds to several parameters specified in the mudela +file\&. They are overridden by corresponding command line options\&. +.PP +.IP "language="";" +Specify LaTeX language +.IP "latexheaders="";" +Specify additional LaTeX headers file +.IP "orientation="";" +Set orientation\&. +.IP "paperlinewidth="";" +Specify the width (pt, mm or cm) of the printed lines\&. +.IP "papersize="";" +Specify name of papersize\&. +.PP +.SH "Environment" +.PP +.IP "LILYINCLUDE" +Additional directories for input files\&. +.IP "TMP" +Temporary directory name\&. Default is /tmp +.PP +.SH "Files" +.PP +\fBtitledefs\&.tex\fP is inspected for definitions used to extract +additional text definitions from the mudela file\&. In the current +version the following are defined: +.PP +.IP "title" +The title of the music\&. Centered on top of the first page\&. +.IP "subtitle" +Subtitle, centered below the title\&. +.IP "composer" +Name of the composer, rightflushed below the subtitle\&. +.IP "arranger" +Name of the arranger, rightflushed below the composer\&. +.IP "instrument" +Name of the instrument, leftflushed at same level as the composer\&. +.PP +\fB/usr/local/share/lilyrc /etc/lilyrc $HOME/\&.lilyrc \&./\&.lilyrc\fP +are files to set up default running conditions/variables, Bourne shell +syntax\&. All files are parsed, in the shown sequence\&. The variables are +overridden by variables in the mudela file, and by command line options\&. +In the current version the following are allowed: +.PP +.IP "LANGUAGE=" +Specify LaTeX language\&. +.IP "LATEXHF=" +Specify additional LaTeX headers file +.IP "LILYINCLUDE=" +Additional directories for input files\&. +.IP "ORIENTATION=" +Set orientation - portrait is the default\&. +.IP "OUTPUTDIR=" +Set output directory\&. +.IP "PAPERSIZE=" +Specify name of papersize\&. +.IP "PHEIGTH=" +Specify paperheight (points - an inch is 72\&.27, a cm is 28\&.453 points)\&. +.IP "TMP=" +Temporary directory name\&. +.IP "PWIDTH=" +Specify paperwidth (points - an inch is 72\&.27, a cm is 28\&.453 points)\&. +.PP +.SH "See Also" +.PP +lilypond(1), tex(1), latex(1) +.PP +.SH "Bugs" +.PP +If you have found a bug, you should send a bugreport\&. +.PP +.IP o +Send a copy of the input which causes the error\&. +.IP o +Send a description of the platform you use\&. +.IP o +Send a description of the LilyPond and ly2dvi version you use\&. +.IP o +Send a description of the bug itself\&. +.IP o +Send it to bug-gnu-music@gnu\&.org <bug-gnu-music@gnu\&.org> (you don\'t have to subscribe +to this mailinglist)\&. +.PP +.SH "Remarks" +.PP +Many papersizes are now supported\&. Information on other sizes +(LaTeX names, horizontal and vertical sizes) should be mailed to +the author or to the mailing list\&. +.PP +Supported papersizes are: +.PP +a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, archA, archB, archC, archD, +archE, b0, b1, b2, b3, b4, b5, flsa, flse, halfletter, ledger, legal, +letter, note +.PP +.SH "AUTHOR" +.PP +Jan Arne Fagertun <Jan\&.A\&.Fagertun@energy\&.sintef\&.no>, http://www\&.termo\&.unit\&.no/mtf/people/janaf/ +.PP diff --git a/Documentation/man/out/mi2mu.1 b/Documentation/man/out/mi2mu.1 new file mode 100644 index 0000000000..836de8b0cc --- /dev/null +++ b/Documentation/man/out/mi2mu.1 @@ -0,0 +1,68 @@ +.TH "LilyPond" "1" "1998" "Mi2mu" "The LilyPond package" +.PP +.PP +.PP +.SH "NAME" +Mi2mu \- convert MIDI to \fBmudela\fP(5) +.PP +.PP +.SH "DESCRIPTION" +Mi2mu translates a MIDI input file to Mudela (GNU LilyPond source +format)\&. Mi2mu is part of the GNU LilyPond music typesetting package\&. +.PP +manpagessynopsis() +.PP +mi2mu [options] midi-file +.PP +.SH "OPTIONS" +.PP +.IP "-b, --no-quantify," +Write exact durations, e\&.g\&.: `a4*385/384\'\&. +.IP "-D, --debug," +Print lots of debugging stuff\&. +.IP "-h, --help," +Show a summary of usage\&. +.IP "-I, --include=\fBDIR\fP," +Add DIR to search path\&. +.IP "-k, --key=ACC[:MINOR]," +Set default key\&. ACC > 0 sets number of sharps; ACC < 0 sets number +of flats\&. A minor key is indicated by ":1"\&. +.IP "-n, --no-silly," +Assume no plets or double dots, assume smallest (reciprocal) duration 16\&. +.IP "-o, --output=\fBFILE\fP," +Set \fBFILE\fP as default output\&. +.IP "-p, --no-plets," +Assume no plets\&. +.IP "-q, --quiet," +Be quiet\&. +.IP "-s, --smallest=N," +Assume no shorter (reciprocal) durations than N\&. +.IP "-v, --verbose," +Be verbose\&. +.IP "-w, --warranty," +Show the warranty with which mi2mu comes\&. (It comes with \fBNO WARRANTY\fP!) +.IP "-x, --no-double-dots," +Assume no double dotted notes\&. +.PP +.SH "DISCLAIMER" +.PP +Mi2mu is copyright 1996, 1997 by its authors\&. Mi2mu is distributed +as part of GNU LilyPond, under the terms of the GNU General Public +License\&. Mi2mu is provided without any warranty what so ever\&. +Mi2mu may be freely distributed\&. For further information consult +the GNU General Public License, from the file \fBCOPYING\fP\&. +.PP +.SH "SEE ALSO" +.PP +.IP "\fBlilypond\fP(1)" +The GNU LilyPond music typesetter\&. +.IP "mudela-man" +On the input format\&. This is a LilyPond-enhanced LaTeX document\&. +.PP +.SH "AUTHOR" +.PP +Please consult the documentation file \fBAUTHORS\fP for more detailed +information, and small contributions\&. +.PP +Jan Nieuwenhuizen <janneke@gnu\&.org>, http://www\&.xs4all\&.nl/~jantien +.PP diff --git a/Documentation/man/out/mudela-book.1 b/Documentation/man/out/mudela-book.1 new file mode 100644 index 0000000000..478df6e6eb --- /dev/null +++ b/Documentation/man/out/mudela-book.1 @@ -0,0 +1,59 @@ +.TH "LilyPond" "1" "1998" "The LilyPond package" "mudela-book" +.PP +.PP +.PP +.SH "NAME" +mudela-book \- integrate LaTeX and mudela +.PP +.PP +.SH "DESCRIPTION" +\fBmudela-book\fP is a script that helps +integrating mudela and \&. mudela-book runs LilyPond on +fragments of mudela in your source file, and includes the results into +document that can be processed with \&. The result is a text +document with formatted music integrated\&. +.PP +If the file contains the ``block\'\' +.PP + +.DS + + + \ebegin{mudela} + CONTENTS + \eend{mudela} + +.DE + + +.PP +then LilyPond is run on CONTENTS\&. mudela-book puts the result back, +surrounded by \f(CW\epreMudelaExample\fP and \f(CW\epostMudelaExample\fP +commands\&. The \f(CW\ebegin\fP takes the following options: +.PP +.IP "fragment" +mudela-book adds some redtape\&. You +can substitute voice-contents for CONTENTS in this case\&. +.IP "verbatim" +CONTENTS is copied into the TeX source enclosed in a verbatim block\&. +.PP +.SH "Synopsis" +.PP +.IP "--outname" +The name of file to output\&. If this option is not given, +the output name derived from the input name\&. The extension \fB\&.doc\fP +is stripped, and \f(CW\&.mudtex\fP appended\&. +.IP "--outdir" +The directory to output lilypond output and input to\&. +.IP "--help" +print a short help message +.PP +.SH "BUGS" +.PP +Doesn\'t handle incorrect input sanely\&. mudela-book is written in +python, so you have install python\&. +.PP +.SH "AUTHOR" +.PP +Han-Wen Nienhuys <hanwen@cs\&.uu\&.nl>, http://www\&.cs\&.uu\&.nl/people/hanwen +.PP diff --git a/Documentation/tex/Makefile b/Documentation/tex/Makefile index 8cde48019c..a441b89d7c 100644 --- a/Documentation/tex/Makefile +++ b/Documentation/tex/Makefile @@ -29,8 +29,9 @@ default: GENHTMLS = engraving colorado vocabulary computer-notation OUTGENHTMLS = $(addprefix $(outdir)/, $(GENHTMLS:%=%.html)) -$(outdir)/mudela.dvi: $(outdir)/vocabulary.tex $(outdir)/engraving.bib -$(outdir)/mudela.html: $(OUTGENHTMLS) + +$(outdir)/glossary.dvi: $(outdir)/vocabulary.tex +$(outdir)/glossary.html: $(OUTGENHTMLS) local-WWW: $(HTML_FILES) $(OUTDOC_FILES:.doc=.ps.gz) $(OUTYO_FILES:.yo=.latex) $(OUTYO_FILES:.yo=.ps.gz) $(addprefix $(outdir)/, $(BIB_FILES:.bib=.html)) $(datafiles) $(PYTHON) $(step-bindir)/ls-latex.py --package=$(topdir) --title 'LaTeX documents about LilyPond' \ diff --git a/Documentation/tex/glossary.yo b/Documentation/tex/glossary.yo new file mode 100644 index 0000000000..803c51c0ad --- /dev/null +++ b/Documentation/tex/glossary.yo @@ -0,0 +1,94 @@ + +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(<font color=black>) + +latexpackage()(a4wide) +latexlayoutcmds( +%\usepackage[latin1]{inputenc} +\input mudela-book +) + +whenlatex(notableofcontents()) +whentexinfo(notableofcontents()) + +article(Glossary of notation terms) + (Han-Wen Nienhuys and Jan Nieuwenhuizen) + (nop()PIPETHROUGH(date "+%B %d, %Y")()()nop()) + +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{vocabulary} + } +)) + +whenhtml( + includeverbatim(DOEXPAND(outdir)/vocabulary.html) +) + +whenlatex(latexcommand( + \bibliographystyle{plain} + \bibliography{engraving} +)) + + +COMMENT(The bib stuff is somewhere else on the WWW site) +COMMENT( +setchapterstring{} + +whenhtml{ + nchapter{Bibliography} + includeverbatim{out-www/engraving.html} +}) + diff --git a/Documentation/tex/mudela.yo b/Documentation/tex/mudela.yo deleted file mode 100644 index 87407dfb4b..0000000000 --- a/Documentation/tex/mudela.yo +++ /dev/null @@ -1,2676 +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(<font color=black>) - -latexpackage()(a4wide) -latexlayoutcmds( -%\usepackage[latin1]{inputenc} -\input mudela-book -) - -whenlatex(notableofcontents()) -whentexinfo(notableofcontents()) - -report(Mudela, the Music-Definition Language) - (Han-Wen Nienhuys and Jan Nieuwenhuizen) - (nop()PIPETHROUGH(date "+%B %d, %Y")()()nop()) - -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}) -) - -chapter(Tutorial) - -whenhtml( -nsubsect(Disclaimer) -This document is written in url(Yodl)(ftp://pcnov095.win.tue.nl/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(). -) - -sect(Introduction) -label(tutorial:introduction) -latexcommand(\parindent2pc) - -If you are reading this, you probably are interested in printing -music. LilyPond is a program that can print music from a -specification that you, the user, supply. Using LilyPond may be a bit -quaint in the beginning, because you have to give that specification -using a em(language). That might not be what you expect if you are -familiar with graphical interfaces. But there are some big -advantages: first, once you master the language, entering music can be -done quite efficiently. Secondly, it is possible to explain exactly -what the meaning of a language is, i.e., the semantics are much -clearer. Thirdly, since the program is not interactive, no tradeoffs -have to be made between processing speed and beauty of the output. - -This chapter is a gentle introduction to Mudela, the language that -instructs LilyPond to typeset music. We will explain Mudela by -presenting a series of examples of Mudela input. The corresponding -output will be shown on the right or below, just as it was produced by -LilyPond. - -We will assume that you more or less understand the basics of music notation. -If you are not familiar with the English terms for music notation, you -should consult bind(Appendix)ref(glossary): it contains a glossary -of musical terms along with translations in some other languages. - -If you want to try the examples given here, you should have look a -look at bind(Section)ref(sec:running-lilypond) first. - -sect(Music copying, music definition and music entry) -label(tutorial:copying-vs-def-vs-entry) - -If you have copied music before, using LilyPond may seem awkward -to you in the beginning. The purpose of LilyPond informally is -explained by the term `music typesetter'. - -This may give the impression that the program is like a drawing tool -and that it lets you control precisely how the music is formatted. -This is not the case: not only does the program print musical symbols, -LilyPond also tries to make esthetic decisions---to be precise, we -programmed her to do what we find nop(pretty.)footnote(We formed our -taste by looking at, and reading all about fine music engraving. Of -course, our taste is also bound by all the accepted rules of common -music notation.) You do not have complete control over what is -happening. Usually that is not a big loss, since good engraving is a -very complex trade. In other words, you don't have control, so you do -not have to worry about what is happening precisely. - -Secondly, we expect you to enter the meaning of the music, not the -sheet music itself. The input to LilyPond is a music definition, -which is something different than notation: notation is a graphical -system. Put more concretely: your input to LilyPond should contain -information like ``a dotted quarter note, pitch nop(d)sups(2).'' -LilyPond will figure out from the musical information that a black -note head with a stem but without flag, fourth staff line, with dot -should be printed. - -When you are copying music by hand from a printed score, you don't have -to know what the score means; you just copy the symbols. With LilyPond -such a thing is not possible. You have to enter the meaning of the -symbols, and this might not always be as easy. On the other hand, once -entered, any piece of music can be played and transposed automatically. - -Finally, in some spots we will cheat a bit when it comes to musical -definition. Mudela has some entry modes that help to make typing -Mudela pleasant. For example, the phrase ``a dotted quarter note, -pitch nop(d)sups(2)'' translates to the following longhand: -verb( -\musicalpitch { 1 2 0 } \duration { 2 1 }) - -This data is what we consider the musical em(definition). Mudela -has a special entry mode where you can conveniently abbreviate this to -`code(d''4.)'. There are some features that also make the quotes and -numbers in `code(d''4.)' superfluous in some cases. - -For those who are curious, the numbers in `code(\musicalpitch { 1 2 0 -})' example mean octave, notename, and accidental respectively. The -numbers in `code(\duration { 2 1 })' are the (negative) logarithm of the -duration (2 is a quarter note, 3 is an eighth note, etc.) and the number -of augmention dots respectively. - -sect(When you know the notes to nop(print)ellipsis()) - -The basic building block of music is the note. You can have LilyPond -print a note by specifying its pitch and duration. The pitch of the -central C is written as code(c'). This is in line with musicological -notation; there this pitch is transcribed as nop(c)sups(1) or c'. A -quarter-note duration is written as code(4). So, to print a quarter -note whose pitch is central C, you enter the following: -mudela(fragment,verbatim,center)( c'4 ) - - -subsect(Duration) - -The duration of a note is specified as a number: a whole note is -denoted by 1, a half note by 2, a quarter by 4, and so on. If you -want to augment a duration with a dot, simply affix a period to the -number. Here are some random notes to show how it works. - -mudela(fragment,verbatim)( - c'1 c'2 c'4 c'8 c'16 c'32 c'64 c'64 c'2. c'8. c'16 -) - -subsect(Basic pitches) - -The pitch code(c') actually consists of two parts: one part for the -note name, and one for the octave. The letter specifies which note -name to use: note names simply are the letters code(a) to code(g). -The number of apostrophes specifies the octave to use: the central C -is denoted by code(c').footnote(By convention, the A above central C -at concert pitch is the tone that is used to tune instruments. Its -frequency is about 440 Hz.) The C which is an eighth higher (the C in -the ``two-line octave'') is denoted by code(c''): every octave adds a -quote. A note name without quotes designates the pitch below code(c') -(the C in the ``small octave''). If you want to go down even further, -commas should be added, e.g., the C in the ``contra octave'' is -expressed as code(c,,).footnote(The comma is meant to represent a -sunken apostrophe.) - - -This example demonstrates octaves: -mudela(fragment,verbatim,center)( - c,,4 c,4 c4 c'4 c''4 c'''4 -) - -And this example demonstrates notenames: -mudela(center,fragment,verbatim)( - c'4 d'4 e'4 f'4 g'4 a'4 b'4 c''4 -) - -A rest can be entered as a note with the special name code(r), e.g., -mudela(fragment,verbatim,center)(r4) - -This already gives us enough material to make simple songs. In -bind(Figure)ref(fig:twinkle1) a portion of the traditional song -``Twinkle Twinkle Little Star'' is shown. - -latexcommand(\begin{figure}[h]) - center( -mudela(fragment,verbatim)( - c''4 c''4 g''4 g''4 - a''4 a''4 g''2 -) - latexcommand(\caption{Twinkle twinkle little star (version 1)}) - label(fig:twinkle1) - ) -latexcommand(\end{figure}) - - -subsect(Alterations) - -We have so far ignored chromatically altered pitches. The names `a' -to `g' for entering pitches are convenient: they are short, -pronounceable and they resemble the words for pitches in normal -musical vocabulary. - -Enter flats and sharps. In English there is no standard terse word -for C sharp or C flat. For this reason, we implemented a different, -non-English convention for entering altered pitches: a note is made -sharp by adding the suffix `--is' to its name, and flat by adding the -suffix `--es'. For a double sharp another `--is' suffix is added, for -flats another `--es' suffix. The names for the alterations of C are -given in bind(Table)ref(notename-tab). - -latexcommand(\begin{table}[h]) - center( - table(2)(ll)( - row(cell(english)cell(LilyPond)) - rowline() - row(cell(c double flat)cell(ceses)) - row(cell(c flat)cell(ces)) - row(cell(c natural)cell(c)) - row(cell(c sharp)cell(cis)) - row(cell(c double sharp)cell(cisis)) - ) - ) - latexcommand(\caption{Default note names}) - label(notename-tab) -latexcommand(\end{table}) - -Variations on this convention are used in a number of germanic -languages, notably Dutch, German, Swedish, and Norwegian. To be -precise, LilyPond actually defaults to Dutch notenames, with -code(aes), code(aeses), code(ees) and code(eeses) added for -consistency. - -Throughout this document we will continue to use the Dutch names. To make -(Dutch) pronunciation easier, the a-flat and e-flat are contracted to -code(as) and code(es). Similarly, the a double flat and e double flat are -contracted to code(ases) and code(eses). - -If you are not comfortable with these names, you can make your own. -Note names for different languages are included with the example -initialisation files, amongst others English (C sharp is abbreviated -to code(cs)), Italian, Swedish and Norwegian. If you want to use -these names, you should look at bind(Section)ref(subsect:include) for -information on how to use include files. - -sect(Running LilyPond) -label(sec:running-lilypond) - -In the previous section some basic elements of Mudela were presented. -We didn't want to bore you too much with repetitive details, so we -left out some red tape that's needed for a of Mudela in a form that is accepted -by LilyPond. To -be precise, we wrote code(X Y Z), when we really meant -verb(\score { - \melodic { X Y Z } - \paper {} -}) -We will continue to leave out the red tape this, until the time is fit to explain what the -above it means. - - -Because LilyPond uses a language, it is a so called em(batch) -program. -This means, that you use a -text editor (such as code(emacs) or code(vi)) to create an input -file. When you are done editing your input file, you save it, and you -run LilyPond on the file. If Lily finds any errors in your input file -then nop(she)footnote(We're sure that if computer programs could have - gender, LilyPond would be a female computer program. So we will - refer to the program as a she. This gender-bending is not to tease - you, dear reader. We do it in real life as well. In the past two - years LilyPond has become sort of a baby daughter to us, keeping us - awake at night, but also providing us with lots of joy. We hope you do - not mind our little aberration from the traditions of computer-manual - writing.) COMMENT( - The name LilyPond is actually sort of a girl's name. Can you guess which - one ?) -will complain. If everything went well, then she'll generate a file, that -you can process further to view or print. - -Using LilyPond to print or view some music is a four-step procedure. -To get you started we'll run down the full procedure for you once. - -enumerate( -it() -Fire up your favourite editor (if you don't -know any editors, try code(joe silly.ly)), -and key in the example from bind(Figure)ref(fig:twinkle1), with red tape: -verb( -\score { - \melodic { - c''4 c''4 g''4 g''4 - a''4 a''4 g''2 - } - \paper {} -} -) - -Save your file as file(twinkle.ly).footnote(The default extension for Mudela -files is file(.ly).) - -it() -Run LilyPond on your newly created file: enter code(lilypond twinkle). -LilyPond will then print all kinds of mumbo jumbo that can safely be -ignored. You might see something like this: -verb( -GNU LilyPond 0.1.55/FlowerLib 1.1.39 -Parsing ... [/home/hanwen/musix/spacer/init/lily-init.ly[/home/hanwen/ - - ... stuff left out here ... - - ] Documentation/twinkle.ly] -Interpreting music ...[1] (time: 0.04 seconds) -Preprocessing elements... -Calculating column positions ... [2] -Approximated: 1 lines, (with an average of 4.0 columns) -Time: 0.01 seconds -warning: Can not solve this casting problem exactly; revert to Word_wrap -[2]Time: 0.00 seconds - -Postprocessing elements... -TeX output to twinkle.tex ... -) - -All has gone well; there were some warnings but no errors. The run -resulted in output, a TeX file called file(twinkle.tex). - -file(TeX) is usually spelled TeX(). It is a batch program for -typesetting text. It was developed by the great programmer and -scientist Donald Knuth to typeset his famous bookseries em(The Art of -Computer Programming). As you can see, TeX() can be adapted to do a -lot more. whenlatex(In fact, the document that you are reading now was also -produced with TeX().) COMMENT(ugh.) - - -it() - To do something useful with the output you have to run TeX() on it - first. Run the command code(tex twinkle). The output should resemble this: -verb( -This is TeX, Version 3.14159 (C version 6.1) -(twinkle.tex -Babel <v3.6h> and hyphenation patterns for american, dutch, loaded. -(/home/hanwen/lib/texmf/tex/lilypond/lilyponddefs.tex -(/home/hanwen/lib/texmf/tex/lilypond/dyndefs.tex) -(/home/hanwen/lib/texmf/tex/lilypond/fetdefs.tex -(/home/hanwen/lib/texmf/tex/lilypond/feta20.tex) -(/home/hanwen/lib/texmf/tex/lilypond/lily-ps-defs.tex))) [1] ) -Output written on twinkle.dvi (1 page, 3084 bytes). -Transcript written on twinkle.log. -) - The human translation is ``everything went OK, the result is one - page long, and I put it in file(twinkle.dvi).'' - -it()The file(twinkle.dvi) file is a description of how a piece of -text looks when it is printed. You can view it, or print it. If you -are using a Unix system equipped with X-Windows, then you can issue -the command file(xdvi twinkle) to view the result. If this is not the -case, consult your local TeX() guru on printing and viewing DVI files. -What is in your window should approximately look like this: -mudela()( -\score { - \melodic { - c''4 c''4 g''4 g''4 - a''4 a''4 g''2 - } - \paper { linewidth = 13.\cm; } -} -) - -it() -If you want to print file(twinkle.dvi), you should invoke the command -code(dvips twinkle). Running this command should generate a -PostScript file called file(twinkle.ps). This file can be printed on -any PostScript compatible printer. You should not use any other -tools: the output from LilyPond contains fragments of PostScript which -will not print correctly if you don't use PostScript. If your printer -doesn't understand PostScript, you should check out GhostScript, a -PostScript emulator. -) - - - -The four-pass procedure sketched above is a bit clumsy. Moreover, the -result is pretty crude: the page does not include prettily printed -titles and if you are unlucky, the margins don't come out well. Jan -Arne Fagertun wrote a tool to take the above steps out of your hands, -make neat margins and print titling. The tool is called file(ly2dvi), -and it should be on your system if you use Lily on a Unix platform. -If you use file(ly2dvi), then you can do verb(ly2dvi twinkle.ly ) in -stead of steps 2 and 3. You will feel the real advantage of using -file(ly2dvi) when you add titling to the music. This is something -that we will discuss in bind(Section)ref(tutorial:titling). - - -COMMENT(This document does not cover all of Mudela. Due to technical details, -the precise working of Mudela is coupled to the innards of LilyPond. -If you really want to know all the details, your best bet would be to -get the sources to LilyPond and read the parser and scanner source. -They are in file(lilypond-x.y.z/lily/parser.yy) and -file(lilypond-x.y.z/lily/lexer.ll).) - - - -sect(Chords) - -Up till now we have only considered music that was rather simple. All -the music had notes going in one direction, from left to right, one -note following the other. You might be wondering if this is all Lily -can do, or whether it is possible to stack notes as well (creating -em(chords)). Rest assured: we designed LilyPond while keeping in mind -that she must be able to handle any notation construct that can be -expressed conveniently. Of course we did not leave out chords. - -In Mudela you can form a chord of several notes by enclosing them in -pointed parentheses, bind(i.e.)bind(langle())bind(and)rangle(). ASCII -doesn't really have these delimiters, so Mudela uses the larger-than -(code(>)) and smaller-than (code(<)) signs instead. For example, a -D-major nop(chord)footnote(Recall what was said in the previous -section about flats and sharps: the word code(fis) means an f sharp.) -can be described by the following fragment: -mudela(fragment,verbatim,center)( - <d'8 fis'8 a'8 d''8> -) - - Chords can be entered in the music in the same places that notes -can. As an example we give a snippet of ``Twinkle Twinkle Little -Star'' in chords. The chords may seem, slightly unconventional, but they -only serve to show how chords work. We've aligned the chords -in the input on their starting beat just to help you reading it. -This layout does not influence the typesetting result in any way. - -mudela(verbatim, fragment)( - c''4 c''4 <c''4 g''4> <c''4 e''4 g''4> - <c''4 e''4 a''4> <b'4 d''4 a''4> <b'2 d''2 g''2> - <a'4 d''4 f''4> <bes'4 d''4 f''4> <bes'4 c''4 e''4> <g'4 c''4 e''4> - <e'4 a'4 d''4> <a4 g'4 cis''4> <d'2 f'2 d''2> -) - - - -sect(Shortcuts for duration) - -If you typed the last example into a Mudela file, you will have -noticed that the input has lots of repetitions. You will probably -have made some errors with the right durations and number of -octavation quotes. -To save keystrokes and prevent errors Mudela -has some handy shortcuts. The simplest is the shortcut for -durations. You don't have to type the duration if it -is the same as the last duration entered. This saves a considerable -number of keystrokes, and thus reduces the potential for errors. The -previous example can be reduced to verb( - c''4 c'' <c'' g''> <c'' e'' g''> - <c'' e'' a''> <b' d'' a''> <b'2 d'' g''> - <a'4 d'' f''> <bes' d'' f''> <bes' c'' e''> <g' c'' e''> - <e' a' d''> <a g' cis''> <d'2 f' d''> -) - - -If you entered this, you probably made some little errors with the -right amount of quotes as well. To remedy this, mudela has another -feature called `relative octaves', which reduces the amount of quotes -needed. If you want to enter large pieces of music em(now) we -recommend you make an excursion to -bind(Section)ref(sec:relativeoctaves) and learn about relative -octaves. - - - -sect(Comments) - -If you want to make some private notes about the Mudela code that you -entered, you can do so by inserting comments into your file. The -contents of these comments are ignored by LilyPond. Mudela has two comment -styles: line comments and block comments. The line comment -is introduced by the percent sign: -verb( - c''4 - c''4 % shouldn't this be a different pitch? -) - -Block comments are enclosed in code(%{) and code(%}). - -verb( - c''4 - %{ - Ludwig van Bavaria's original manuscript has an fffff dynamic sign. - Clearly one can see the onset of paranoid schizophrenia in the - composer from these subtle nuances in his writings. - %} - c''4 -) - - -sect(Adding nuances: articulation and dynamics) - -Having just chords and notes does not give you real music. Real music -has more liveliness to it: music can have articulation, dynamics -(louder and softer), etc. This liveliness has notation, so LilyPond -can print it. We'll start out by explaining how to obtain the -smallest grains of nuance: the articulation of a single note. Articulation -is entered by writing a dash and the name of the desired articulation -mark. You have to add a backslash in front of the name to distinguish -it from the name of a note. mudela(fragment,verbatim)( - c''4-\staccato - c''4-\tenuto ) - -Typing a lot of staccato notes in this syntax will get tedious very -quickly. Therefore, Mudela has some handy abbreviations for -articulation marks such as staccato and tenuto. They are shown in the -following example: - -mudela()( -\score{ \melodic { - \property Voice.textstyle = typewriter - c''4-._"c''4-." s4 - c''4--_"c''4--" s4 - c''4-+_"c''4-+" s4 - c''4-|_"c''4-|" s4 - c''4->_"c''4->" s4 - c''4-^_"c''4-\\^{ }" s4 } - \paper { linewidth = 12.\cm; }}) - - -COMMENT(For a full list of supported articulation instructions, refer to the -chapter on features, bind(Chapter)ref(features).) - -Text and digits for fingering can be entered in the same manner: add a -dash and the text or digit to be printed: -mudela(fragment,verbatim)( - c''4-1 g''4-5 c''-"Sul tasto" ) -Currently, the meaning of the -syntax `note-dash-digit/articulation/text' is just ``add a superscript to this -note.'' This is not in line with our goal to em(define) music with -Mudela. We hope that this will be fixed in a future version of the -language. In the meantime you can abuse this: the super- and -subscripts can be forced into up or down position respectively by entering an -a caret (code(^)) or an underscore, code(_) instead of the dash: -mudela(fragment,verbatim,center)( - c'4-^ c'4^^ c'''4-^ c'''4_^ -) - -Dynamic markings are another way to add a nuance to a note. They are -entered by adding the name for the dynamic sign after the note. You -should not enter a dash between the name and the note.footnote(This - is inconsistent. We hope that this will be fixed in a later - version of the language.) -mudela(verbatim,fragment)( - c4 \ff c4 \fp c4 c4 \ppp c4 c4 \sfz -) -COMMENT(UGH) - -sect(Bridging the notes: beams, slurs and ties) - -Up till now most of the typesetting concerned simple fixed symbols -only. Now we turn to variable symbols: symbols that run from one note -to another. In LilyPond terminology, such a symbol is called a -em(spanner). To print a spanner, you have to attach a marker to the -note that begins it and to the one that ends it. - - -The first example of such a symbol is the slur. For the slur, the -start marker is the opening parenthesis. It won't be a surprise that -the stopping marker is the closing parenthesis. -For example: -mudela(fragment,center,verbatim)( c'4( )c'4 ) - -otice that the parentheses should be between the notes.footnote(The -location of the parentheses might be changed in a future version of -the language.) - -It is your job to make sure that each slur that you start also ends. -If it doesn't end, then Bad Things are likely to happen. The slur is -quite flexible: you can nest nop(slurs,)footnote(This is inconsistent when -compared to the syntax for articulation hints. This will probably be -fixed soon.) and you can connect a note with a slur on both the left and the -right side: - -mudela(fragment,verbatim,center)( - c'4(( )c''4 )c'4( )g'4 -) - -Another spanner is the beam (see bind(Figure)ref(mud:beam)). It -indicates the duration of the connected notes, and thus it acts like an -extended version of the flag. Secondly, the pattern of -left/right-pointing beams hints at the metric structure of the -measure. - - -latexcommand(\begin{figure}[h]) - center( - mudela(fragment)([c'8 c'8] [c'16 c'16 c'16 c'16] [c'16. c'32 c'32 c'16.] ) - latexcommand(\caption{Some beams}) - label(mud:beam) - ) -latexcommand(\end{figure}) - - -Strictly speaking, a beam is not a musical concept. The pattern of a -beam can be derived from the structure of the time signature and the durations -of the notes. It is merely a device that helps you understand the -rhythms notated. Unfortunately, LilyPond is not smart enough to insert -beams into your music on her own. You will have to instruct her by -marking the starting and stopping point of the beam with `code([)' and -`code(])' respectively, e.g. - -mudela(fragment,verbatim,center)( - [g'8 g'8] -) - -LilyPond has code that guesses what the pattern should look like, so -that you don't have to specify the beaming for complicated -patterns.footnote(Unfortunately the algorithm used is not foolproof yet: - code([c8. c32 c32]) will produce incorrect results.) - -Again, it is your responsibility to make sure that you end every beam -that you start. - -A third spanner is similar to the slur: the tie. The tie looks like a -slur, but a slur connects whole chords, whereas the tie connects -note heads. Tied notes should be played as one long note. -In analogy with TeX()'s tie (which ties together words with a -space), LilyPond's tie is entered as a tilde, ~. -mudela(verbatim,center,fragment)(c''1 ~ c''4) - -The input convention for the tilde is somewhat peculiar when used in -conjunction with chords. Internally, the extra information that is -represented by the tilde has to be attached to a note (or to a rest, -for that matter). For this reason, you can't put the tilde between -two chords (as in code( <c' g'> ~ <c' g'>)). The tilde sign must be -directly after a note of the chords. It does not matter which -one. The following example demonstrates this: -mudela(fragment,verbatim,center)( - <c'1 ~ g' es''> <c'4 g' es''> -) - -sect(Commands) -label(sec:commands) - -Up till now, we only printed notes, and correspondingly only entered -notes. But notation contains many other constructs, constructs that -help you with reading those notes. Examples of such constructs are -clefs, time signatures, keys etc. - -If you look carefully at the example in -bind(Figure)ref(fig:twinkle1), you will notice that the output -includes some bar lines and clefs, and that there are no references to -those in the input. They were generated automatically. - -Not all such hints can be inserted automatically, and you can also -override some of the settings. This can be done by inserting various -commands between the music. The general form of these commands is -center( - em(keyword) sc(arguments) -) - -em(keyword)s are words that have a special meaning to the parser of -Mudela. Because the parser must be able to distinguish the keywords -from note names, they have to be preceded by a so-called escape -character, the backslash, `code(\)'. To separate the arguments from -any notes that might follow the arguments, you have to end your -command with a semicolon. An added benefit of this construction is -that the commands stand out between your notes, because of the -backslashes. - -So the general form actually is `code(\keyword argument argument ... ;)' -Let us review these commands: - -description( -dit(code(\clef) var(clefname)) This command sets the current clef for notation, - i.e., a clef symbol is printed and the notes following this command - are shifted vertically. The argument is a string, the name of the - new clef. The default clef is the treble clef. - mudela(fragment,verbatim)( - \clef "bass"; c'4 - \clef "treble"; c'4 - \clef "alto"; c'4 - ) -dit(code(\key) var(pitch)) This command changes the current key signature. The - key signature is printed at the start of every line. The argument - is the name of the corresponding major key. The key of C-minor can - thus be specified as `code(\key es)'. - -dit(code(\accidentals) var(pitchlist)) - -This command changes the current key signature. The signature is -given in the form of a list of accidentals, which can be useful for -unconventional keys. The key of C-minor can be specified as -`code(\accidentals bes es as)'. The command `code(\accidentals fis es -bis)' provides a more exotic example. - - -dit(code(\time) var(numerator)code(/)var(denominator)) - This command chages the current time signature. LilyPond uses the - time signature to - calculate where to place the bars that start a measure. These bars - in turn are the places where a system can be broken into lines. - - The default value for this time signature is common time (4/4). You - can also tell this from the Twinkle ``Twinkle Little -Star'' example in bind(Figure)ref(fig:twinkle1). This -song actually has a 2/4 time signature, so a metrically more correct - version would start with as follows: - mudela(fragment,center,verbatim)( - \time 2/4; c'4 c' g' g' - ) - - -dit(code(\cadenza) var(togglevalue)) When typesetting music without a -regular meter (such as an ad libitum cadenza), no bar lines should be -printed. In LilyPond you can achieve this by issuing the command -`code(\cadenza 1)': it turns off the automatically -generated bar lines. - -You switch them on again with `code(\cadenza 0)', and then a bar line -is printed. LilyPond will act as if you are again at the start of a -measure. - -dit(code(\bar) var(bartype)) - This command lets you print special bar lines, such as repeats. You - can also use it to allow line breaks when entering cadenzas. The - argument var(bartype) is a string that describes what kind of bar line to print. - -mudela(fragment,verbatim)( - \bar "|:"; c'4 \bar ":|:"; c'4 \bar ":|"; c'4 \bar "||"; - c'4 \bar "empty"; c'4 \bar "|."; -) - The command `code(\bar "empty")' does not create any visible bar - line, but it does tells LilyPond to allow a linebreak - at that position. - -dit(code(\partial) var(duration)) some music starts with a measure that -isn't fully filled, a so-called upstep. The code(\partial) command -allows you to make -upsteps. The argument is a duration similar to the duration of a note. -Example: - mudela(fragment,verbatim)( - \time 4/4; - \partial 4; - [d'8 dis'] e' c''4 e'8 c''4 - ) - - dit(code(\grouping) var(durationslist)) sets the metric structure of the measure. - Its effect can best be shown by an example: - mudela(fragment,verbatim)( - \time 5/16; - \grouping 16*3 16*2; - [c'8 c'16 c'8] - \grouping 16*2 16*3; - [c'8 c'16 c'8] - \grouping 16*5 ; - [c'8 c'16 c'8] - ) - -In practice, you won't be needing this command very often: the -grouping is switched automatically when you issue a code(\time) -command. It is set to a combination of groups -of 2 and 3 beats, with as many groups of -3 as possible (in other words: 4/4 is divided in two times two beats -(2+2), 8/8 in 3+3+2) -) - -The commands that are described above aren't really music, but they -can be used in the same places as notes. This makes the grammar of the -language simpler. It is possible to put a command into a chord. -For example, the following two snippets of Mudela produce identical output. -verb( - <c4 e g \time 2/4;> - \time 2/4; <c4 e g> -) - - - -sect(Complex music: more than one staff) -label(tutorial:more-staffs) - - -Now we explain how to typeset music that runs in multiple staffs. -Consider the following---somewhat unrealistic---example: - -mudela(fragment)( - \type GrandStaff <e'4 {\clef bass; g4^""} > -) - - The music consists of two notes. Perhaps this is sheet music for a -piano player, and one note is meant to be played with the left hand, -and the other with the right hand. That music would sound the same if -it were written as a single chord on a single staff, i.e., -mudela(fragment)( - <g4 e'4> -) - - -This is another example where we can see that there can be a difference -between a musical idea, and the way it is expressed in notation. - -The Mudela construct for multiple staffs reflects the similarity -between the two examples: to get multiple staffs in Mudela you enter a -chord, with an additional instruction to tell LilyPond that the chord -does not represent notes stacked together, but staffs stacked -together. - -If a piece of music is to be interpreted as a staff, then this can be -expressed with the code(\type) construct. The following input says -``the quarter note with pitch e should be put on a staff.'' - -verb( - \type Staff e'4 -) - -The same can be done for the other note, i.e., - -verb( - \type Staff g4 -) - -If you want to stack these staffs, you must create a chord of both: - -verb( - < \type Staff e'4 - \type Staff g4 - > -) - -This looks reasonable, but the effect of this input is not what you -might expect (try it!). When interpreting this chord LilyPond will -start with the first entry. She'll look for a (nameless) staff. Such a -staff is not found, so it is created. On this staff the code(e) note -is put. When the second code(\type) entry is read, LilyPond will -start looking for a nameless staff. The staff that contains the -code(e) is found, and the code(g) is put there as well. - -The correct solution is to label both code(\type) constructs with -different names, for example code(trebleStaff) and code(bassStaff). -This makes LilyPond distinguish between them, and create two staffs: - -mudela(verbatim,fragment)( - < \type Staff = trebleStaff e'4 - \type Staff = bassStaff g4 - > -) - -The names that you choose do not matter just as long as they are -different. This is almost right, except for the brace at the left and -the clef of the second staff. The bass clef will be taken care of in -the next chapter. If you want a brace, then you have to tell LilyPond -that the chord you just formed is to be interpreted as a so-called -grand staff. This is also done with the code(\type) command. -mudela(verbatim,fragment)( - \type GrandStaff < - \type Staff = treblestaff e'4 - \type Staff = bassstaff g4 - > -) - -sect(Appending instead of stacking: sequential music) -label(tutorial:voice) - -The previous section dealt with a pretty hypothetical situation: sheet -music with two staffs and each staff containing only one single note. -In real-life situations staffs contain more than one note. They -contain music that has to be played in sequence. A staff can contain -a em(voice). We haven't learned how to make a voice yet: we need a -new construct to express this notion of `voice'. - -The construct is called em(sequential) music. A list of musical -objects (e.g., notes, chords or commands) can be made into sequential -music by enclosing the list in braces; for example: - -mudela(fragment,verbatim,center)( - { c'4 c'4 } -) -mudela(fragment,verbatim,center)( - { <c'4 e'> <e' g'> } -) - - -We could have called this construct more colloquially `voice', but -this would cause confusion later on, when a second kind of voice -enters the scene. Similar confusion might arise from the word -`chord', therefore from now on, we will talk about `simultaneous -music', when we refer to items enclosed in < and >. - - -The notion of a em(new) construct needs some explanation: we have been -using sequential music all the time, except that it was hidden in the -red tape in bind(Section)ref(tutorial:introduction). - - - -If we want to put whole voices onto a staff, then we have to -substitute sequential music for the single notes in the example from -the previous section. A code(\clef) command in the second piece of -sequential -music will also set the clef in -the bass staff. -mudela(fragment,verbatim)( - \type GrandStaff < - \type Staff = treblestaff { e'4 f'} - \type Staff = bassstaff {\clef "bass"; g a } - > -) - -COMMENT(You can nest simultaneous music and chords in any way you want. If -you are interested in the entire story, you should consult -bind(Chapter)ref(chap:features), which has a grammar in -bind(Section)ref(sec:grammar).) - -sect(Notation context) - -This section is about translation contexts, a topic of LilyPond that -is somewhat advanced. You don't have to understand this to use -LilyPond to print simple music. If you don't want to typeset fancy -polyphonic music or tweak the LilyPond notation engine, you can skip -the next two sections. - -In bind(Section)ref(tutorial:more-staffs) it was explained, that there -are more ways to notate a simple chord: as a single voice on a single -staff or in multiple staffs (and we'll soon see, that you can typeset -it as multiple voices on a staff). Obviously the concept of staff is not -really something musical. But what is it then? - - -The most simplistic explanation is: a staff is a peculiarity of the -notation system. In other words, a staff is a graphic device, a -special picture of five lines on which one can print note heads. To -avoid confusion, we will call this view on the concept of staff -`staff symbol' from now on. - - -There is more to it than meets the eye and mind. A staff -contains---besides a staff symbol--- some more components: -itemize( -it()A staff can a have a key signature (printed at the left) -it()A staff has bar lines -it()A staff has a clef (printed at the left) -) -To explain what a staff really is, we'll try to print music without -these components. If these components aren't printed, it is still -possible to print music: -mudela()(\score{ -\melodic \relative c' { \time 2/4; g'4 c,4 a'4 f4 e c d2 } -\paper { - linewidth = -1.; - Staff = \translator { - \type "Line_group_engraver_group"; - - defaultclef = violin; - - \consists "Timing_engraver"; - \consists "Separating_line_group_engraver"; - - \accepts "Voice"; - } - } -}) - -As you can see, one can still make out the general form of the melody -and the rhythm that is to be played, but the notation is difficult to -read and the musical information is not complete. The stress pattern -in the notes can't be deduced from this output. For this, we need a -time signature: - -mudela()( -\score { - \melodic \relative c' { \time 2/4; g'4 c,4 a'4 f4 e c d2 } - \paper{ - linewidth = -1.; - Staff = \translator { - \type "Line_group_engraver_group"; - defaultclef = violin; - \consists "Time_signature_engraver"; - \consists "Separating_line_group_engraver"; - \accepts "Voice"; - } - } -}) - -Technically speaking you know where the strong and weak beats are, but -it is difficult to find them quickly. Bar lines help you in finding -the location within the measure of the notes: -mudela()( -\score { - \melodic \relative c' { \time 2/4; g'4 c,4 a'4 f4 e c d2 } - \paper{ - linewidth = -1.; - Staff = \translator { - \type "Line_group_engraver_group"; - defaultclef = violin; - \consists "Bar_engraver"; - \consists "Time_signature_engraver"; - \consists "Separating_line_group_engraver"; - \accepts "Voice"; - } - } -}) - -We can remedy part of the difficulties with reading pitches by adding a staff -symbol: - -mudela()(\score{ - \melodic\relative c' { \time 2/4; g'4 c,4 -a'4 f4 e c d2 } \paper { - linewidth = -1.; - Staff = \translator { - \type "Line_group_engraver_group"; - - defaultclef = violin; - \consists "Bar_engraver"; - \consists "Time_signature_engraver"; - \consists "Staff_sym_engraver"; - \consists "Separating_line_group_engraver"; - - \accepts "Voice"; - } - } -}) - -This makes the output decidedly easier to read, but you still don't -know what the pitches of the notes above are. So this is still not -enough. But suppose you see the following notation: -mudela()(\score { - \melodic \relative c' {\clef alto; \time 2/4; g'4 c,4 a'4 f4 e c d2 } -\paper { - linewidth = -1.; - Staff = \translator { - \type "Line_group_engraver_group"; - - defaultclef = violin; - \consists "Bar_engraver"; - \consists "Time_signature_engraver"; - \consists "Clef_engraver"; - \consists "Staff_sym_engraver"; - \consists "Timing_engraver"; - \consists "Separating_line_group_engraver"; - - \accepts "Voice"; - } - } -}) - -Now you know the pitch of the notes: you look at the start of the line -and see a clef, with this clef, you can determine the notated pitches. -You have found the em(context) in which the notation is to be -interpreted! - -So the context determines the relationship between a piece of music -and its notation: you, the reader, use context to deduce music from -notation. Because LilyPond is a notation ``writer'' instead of a -reader, context works the other way around for Lily: with context a -piece of music can be converted to notation. -The components of a staff form context, and context is needed to read -and write notation. This motivates the following definition. - -quote( -A bf(notation context) is a conversion from music to notation. -) - -The example focused mainly on on staffs, but a staff is not the only -type of notation context. Notation contexts may be nested: you can -print polyphonic music by putting multiple `Voice' contexts in one -`Staff' context. The arguments of the code(\type) command (Staff, -GrandStaff) were in fact all names of different contexts. -The notions of ``current clef'' and ``current position within the -measure'' are all properties of notation contexts. Commands like -code(\clef) and code(\cadenza) change these properties. - - -The following is a list of the contexts that are supported by -LilyPond: -description( - -dit(Voice) The code(Voice) context is a context that corresponds to a - voice on a staff. This context handles the conversion of noteheads, - dynamic signs, stems, beams, super- and subscripts, slurs, ties and rests - -dit(Staff) The code(Staff) context handles clefs, bar lines, keys, - accidentals. A code(Staff) context can contain multiple code(Voice) - contexts. - -dit(RhythmicStaff) The code(RhythmicStaff) context is like the staff, - but much simpler: the notes are printed on one line, and pitches are - ignored. code(RhythmicStaff) can contain code(Voice) contexts. - -dit(GrandStaff) A code(GrandStaff) context contains code(Staff) - contexts, and it adds a brace to the output at the - nop(left.)footnote(This is a major deficiency in the current - implementation. Currently stems, - slurs and beams cannot be printed across two staffs. -In reality, a grand staff is a hybrid of one big staff and two stacked staffs.) - - A code(GrandStaff) context can contain multiple - code(Staff)s. Typically, it will contain two code(Staff)s, one - treble staff, and one bass staff. The bar lines of the contained - staffs are connected vertically. - -dit(StaffGroup) A code(StaffGroup) context contains code(Staff) or - code(Lyrics) contexts, and prints a bracket at the left. The bar - lines in the participating staffs are connected. - -dit(Lyrics) As its name suggests, The code(Lyrics) context deals with - typesetting lyrics. This topic will be covered in - bind(Section)ref(tutorial:lyrics). - -dit(Score) The code(Score) context is the toplevel context: no context can - contain a code(Score) context. The code(Score) 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. - - The code(Score) can contain code(Staff), code(StaffGroup), code(Lyrics), code(GrandStaff) and - code(RhythmicStaff) contexts. - -COMMENT(do ChoireStaff) -) - - - Later on, in bind(Section)ref(tutorial:engravers) we will -explain how you can create your own contexts. - -If you are familiar with structured documents (like HTML, SGML or -LaTeX()), you might see the analogy of a context with a stylesheet: a -stylesheet is neither presentation nor information, but rather a -recipe em(how) a specific piece of information should be presented. -Analogously, a notation context is neither music nor notation, but the -conversion between the two. The big difference with text is that in -music notation the elements provided by context are essential to -understanding what is notated. - - - -sect(Polyphonic music (or: Notation context properties)) - -In the last section we explained that a notation context can have -properties that influence the conversion from music to notation. A -simple example of such a property is the clef: the type of clef partially -determines the vertical position of note heads in a staff. Some of -these properties can be modified by commands such as code(\clef) and -code(\time). But there is more: notation contexts also have -properties are settable in a generic fashion. We will demonstrate -this feature by printing multiple voices on a staff. - -In polyphonic (keyboard) music and orchestral scores often more than -one voice is printed on one staff. We'll explain how to achieve this -effect with LilyPond. The effect is not unlike the two stacked staffs -from bind(Section)ref(tutorial:more-staffs), except that we don't want -to stack staffs but voices. Thus, the general template is the following: -verb( - \type Staff < - \type Voice = one ... - \type Voice = two ... - > -) - -On the ellipsis there should be music going from left to right, in -otherr words, there should be sequential music, notes enclosed in -braces. Let us try the following simple melodies: - -mudela(fragment,verbatim)( -\type "Staff" < - \type "Voice" = "one" { r4 as'4 () as'4 g'4 } - \type "Voice" = "two" { g'2 f'4 e'4 } ->) - -As you can see the result is not quite perfect. The notes on the last -two beats look like plain chords and not like separate voices. What -really happened was that the stems of the upper and lower voices were -printed on top of each other. If you have tried running this example, you will probably -have noticed a complaint about ``too many -clashing notecolumns'' during the LilyPond run. -This complaint refers to the overlapping stems. - -To remedy this, engravers traditionally make the stems of the upper -and lower voice point in different directions: the stems of the lower -voice point down, and the stems of the upper up, as shown in -bind(Figure)ref(tutorial:multi-voice-fig). - -Surely the direction of a single stem is a property of the stem as a -graphical object. But the fact that all of the stems in a voice point -in the same direction is not directly graphical. Since this is a -property shared by all the stems in the voice, it is logical to -consider this property to be a property of the context code(Voice). -And this is how it's done in LilyPond: the context code(Voice) has an -attribute whose value is the direction to use -for stems. You can change it to `up' -by issuing the following phrase:footnote(The name code(ydirection) is -no mistake. The property also controls the up/down directions of -super-/subscripts, slurs, ties, etc.) - -verb( - \property "Voice"."ydirection" = "1" -) - -This command should be read as ``change the property called -code(ydirection) within the current code(Voice) context to the value -code(-1).'' For the property code(ydirection) the value code(1) means -`up', and code(-1) means `down'. The proper way to code the -polyphonic example is given in bind(Figure)ref(tutorial:multi-voice-fig). - -latexcommand(\begin{figure}[h]) -mudela(fragment,verbatim,center)( - \type "Staff" < - \type "Voice" = "one" { - \property Voice.ydirection = "1" - r4 as'4 () as'4 g'4 } - \type "Voice" = "two" { - \property Voice.ydirection = "-1" - g'2 f'4 e'4 } - > -) - latexcommand(\caption{multiple voices}) - label(tutorial:multi-voice-fig) -latexcommand(\end{figure}) - -Other properties can also be set, and they can be within different -contexts. In general, you can set a property by specifying -code(\property) var(contexttype)code(.)var(propertyname) code(=) -var(value). Both var(ContextType), var(PropertyName) and var(Value) -should be strings. - -The effect of a property is pretty much hardwired into the -implementation (and thus subject to change), so we will not deal with -all the possible properties in detail. Among other characteristics that -can be set are the layout of slurs and beams. The initialisation file -file(property.ly) explains most properties. - -We conclude this section with another example of a context property. -Polyphonic music that has three or four voices can't be printed by -simply changing the directions of the stems for each voice, obviously. -Traditionally, some chords are shifted horizontally to print if this many -voices have to be printed. -LilyPond can also do this, and the property that controls the -horizontal shifting is called code(hshift). The notes in a -code(Voice) context that has code(hshift) set to a true value (i.e., -non-zero or non-empty), will be shifted horizontally in the case of a -collision. The following example demonstrates the effect. - -mudela(fragment,verbatim)( - \type "Staff" < - \type "Voice" = "one" { - \property Voice.ydirection = "1" - r4 as'4 () as'4 g'4 } - \type "Voice" = "two" { - \property Voice.ydirection = "1" - \property Voice.hshift = 1 - g'2 f'4 e'4 } - \type "Voice" = "three" { - \property Voice.ydirection = "-1" - [d'8 dis'] [d' cis'] [c' b] c'4 - } - > -) - -sect(Lyrics) -label(tutorial:lyrics) - -Now for something completely different: Lyrics. Lyrics are also -considered to be music, although a lyric by itself does not have any -pitch. Producing lyrics has two aspects. First, you have to enter the -text, i.e., the syllables along with their durations. -After this, you have to specify how to convert these to graphics. - -Lyrics consist of syllables, which are strings together with -durations. Previously we only entered note names, so for entering -lyrics we have to instruct LilyPond that what we enter are not note -names but words---or rather: strings. This instruction is the keyword -code(\lyric). After entering this keyword you can enter a musical -construct---sequential music, simultaneous music, code(\type) -entries, etc.--- but with syllables in stead of pitches. For example: -verb( \lyric { 'got8 me on my knees4, Le-8 lie! }) - -The effect of code(\lyric) can be compared with the effect of the -doublequote character, code("), for it also changes the lexical -meaning of spaces and characters. This mode is another example of a -handy input feature of the language. - -Next comes the conversion to notation. LilyPond can't (yet) figure -out that lyrics need different treatment than notes. As a result, the -default conversion will try to put the text you entered as note heads -onto a staff, and this will fail. This default must be overriden with -a code(\type) keyword. Printing syllables of text in a line is done -by a context called code(Lyrics). You can select this context with -the code(\type) keyword. Here is a simple example: - -mudela(fragment,verbatim)( - \type Lyrics \lyric { 'got8 me on my knees,4 Le-8 lie! }) - -The result is technically more or less correct, but without a melody it -just doesn't work, so let's add a blob of cream: -mudela(fragment,verbatim)( - < - \type Staff { c''8. c''16 bes'8. a'16 g'4 f'8 g'4. } - \type Lyrics \lyric { 'got8. me16 on8. my16 knees,4 Le-8 lie!4. } - > -) - -The strings that makes up each syllable in the lyrics block are passed -along to TeX() verbatim, so if you are proficient with TeX() you can -do various nifty things. Just keep in mind that a syllable either -starts with a letter (a character in the range `code(a)' to `code(z)' -or `code(A)' to `code(Z)'), or it is a string enclosed quotes. It ends -with either a number for the duration, or a space. A last feature -that should be mentioned is the space-lyric: if you want to enter -a single ``syllable'' that consists of multiple words, i.e., words -separated by spaces, you should use an -underscore instead of a space. All these tricks are demonstrated in -the following example: - -COMMENT( urg -\type Lyrics \lyric { 'got_m\textbf{e}4 on8. m$\cal_Y$16 knees,4 Le-8 lie!4.} -\type Lyrics \lyric { 'got_m{\bf e}4 on8. m$\cal_Y$16 knees,4 Le-8 lie!4.} -) - -mudela(fragment,verbatim)(< - \type Staff { c''8. c''16 bes'8. a'16 g'4 f'8 g'4. } - \type Lyrics \lyric { 'got_me4 on8. m$\cal_Y$16 "3s,"4 Le-8 lie!4.} -> -) - -The spacing in the above example is a bit skewed because Lily can't -tell that the long syllables you entered are not ordinary characters, -but expand to really small symbols. - - - - -COMMENT(Rood is de kleur van geluk.) -COMMENT(Dat geldt ook voor haar.) - - -sect(Toplevel Mudela) - -Now the time has come to unravel the red tape that we have hidden from -you in the introduction. Mudela has a hierarchical structure for we -have seen that sequential and simultaneous music can be nested. -Mudela also has other `blocks' that can be nested. The general syntax -for a block is code(\keyword { ... }). - -When you run LilyPond, what happens is that you define music, and -specify one (or more) conversions to apply to that music, for example -a conversion to notation. This is done by putting the definition of -the music and the definition of the conversion together in a -code(\score) block, e.g., -verb( -\score { - % ... music ... - \paper {} -}) - -This is almost the context that should be around all -of the previous examples. The precise context reads thus: -verb( -\score { - \melodic { ... } - \paper {} -}) -On the ellipsis, you entered what shown as the example input. -You can see that in the -above example, the code(\melodic { ... }) forms the music, the -code(\paper {}) is a conversion to paper (notation, that is). The -code(\paper) definition is copied from a default definition -(which is in the initialisation file file(paper16.ly)). -The paper part also contains -the definition of the contexts. - -The keyword code(\melodic) is analogous to the code(\lyric) keyword. It -will switch the tokenizer into a mode that interprets plain words as -note names. If it can't recognize the words as a note name, it will -assume that they are strings. That is the reason why you can write -code(\clef bass) in stead of code(\clef "bass"); most of the strings -in code(\melodic) mode can be written without quotes. - -The braces that you see after the code(\melodic) keyword are the -braces that are around sequential music. Because of these braces, the -sequences of notes in our simple examples were sequential (and not -simultaneous). As a result the notes were printed from left to right, -and not stacked. - -sect(Identifiers) - - -Now that we are comfortable with the toplevel entries in a mudela -file, we can investigate some more of the recreations on toplevel, in -particular em(identifiers). Generally you can define an identifier by -entering code(identifierName = ... ) -where there can be a variety of things on the ellipsis. - -Here is a (partial) list of what you can abbreviate with identifiers -at top-level. -itemize( -it()The code(\score) block -it()The code(\paper) block -it()The code(\midi) block (to be explained in - bind(Section)ref(tutorial:sound)) -it()Music (sequential music, simultaneous music etc.) -it()Durations -it()Strings -it()Translators (to be explained in bind(Section)ref(tutorial:engravers)) -it()Integers -it()Reals -) - -When you refer -to the abbreviated entity, you must precede code(identifierName) -with a backslash, i.e., code(\identifierName). For example: -mudela(verbatim)( - czerny = \melodic { [c16 g e g] } - \score { - \melodic \type GrandStaff < - { c''2 g''2 } - { \clef bass; \czerny \czerny \czerny \czerny} - > - \paper { - linewidth = -1.0; - stem_length = 12.0*\internote; - } - } -) - - - -Another interesting feature of this example are the assignments within -the paper block. Some blocks, such as code(\paper), have a scope of -their own. In the case of the code(\paper) block, these variables -influence the characteristics of the output. As is shown, you can -tune quantities like the stemlength, and enter simple expressions. -The purpose of the negative linewidth is to prevent the music from -being justified. The identifiers that are meaningful are for the -paper block is strongly implementation dependent, so they will not be -listed here. Moreover, since most of the values are predefined to -sensible defaults, there usually is no need to tune these values. - -Recall the properties of a context, that could be set with -code(\property). It is a very general mechanism to tune the output of -the music, that is neatly separated from the real music. -Unfortunately, it is not convenient to type or read, and the precise -effect of a setting property isn't always apparent from its -definition. To remedy this, we can use an identifier to capture the -meaning of a code(\property). - -mudela(verbatim)( -stemup = \property Voice.ydirection = "1" -stemdown = \property Voice.ydirection = "-1" -shift = \property Voice.hshift = "1" -\score { - \type "Staff" \melodic < - \type "Voice" = "one" { - \stemup - r4 as'4 () as'4 g'4 } - \type "Voice" = "two" { - \stemup - \shift - g'2 f'4 e'4 } - \type "Voice" = "three" { - \stemdown - [d'8 dis'] [d' cis'] [c' b] c'4 - } - > - \paper{ linewidth = -1.0\pt; } -} -) - -Several abbreviations like code(\stemup) are defined in the -standard initialisation file file(property.ly). Setting or changing -context properties can have a similar effect as the commands that were -discussed in bind(Section)ref(sec:commands). Don't be fooled by the -similarity in appearance between a declared property-setting entry -and a real command. Real commands are hardcoded into the language -and they have to be terminated by semicolons. - -You can also use identifiers to break up the heavy nesting that can occur -in the code(\score) block. Another useful application is -parametrisation of the music: if you use identifiers in the -code(\score) block, you can make variations of the music by simply -redefining those identifiers. One particular application of this is -part extraction: by using identifiers and redefining them, one can -print extracted parts and a full orchestral score from the same -music definition. - - - -sect(Sound output) -label(tutorial:sound) - -You get output by combining music with definition a conversion to -output. Up till now we have only focused on the graphic output of -traditional engraving. But there is no reason why that should be the -only form of output for music. LilyPond currently supports one other -conversion: the conversion from abstract music to sound. You can have -LilyPond play the music that you entered. The format that is used -for this output is MIDI. - -The only information that you need to enter is the - nop(tempo)footnote(Unfortunately, -this the only thing that can be tuned at this -time. This is a limitation: the tempo of music can vary throughout -the music.) for the performance. The syntax for the tempo is -code(\tempo )var(duration) = var(beatsperminute);), for example: -verb( -\score { - ...music... - \midi { \tempo 4 = 76; } -} -) - -The most useful purpose of this sound output is to prooflisten your -files: typing errors (especially if they involve accidentals) stand -out when you listen. -The output was implemented in a very rudimentary manner, so it is -probably not worth listening to for any other reason. - - -sect(Contexts revisited: engravers) -label(tutorial:engravers) - -As was promised, we will now take a dive into the more wizardrous parts -of LilyPond: redefining (notation) contexts. We previously explained -that a context -itemize( -it()is a conversion from music to notation, -it()can contain other contexts -it()handles specific notation constructs -) - -This characterization almost automatically explains what the definition of a -context should look like: -itemize( -it()It should be part of the ``notation output definition,'' i.e., the - code(\paper) block -it() - It should contain a specification of what other contexts may be contained - in the context we're defining. -it() - It should contain a list of the notation constructs to be - handled. -) - -In practice, the context definition -looks like this: -verb( -\translator -{ - \type "Engraver_group_engraver"; - \accepts "..."; - \accepts "..."; - \accepts "..."; - - \consists " ... "; - \consists " ... "; - \consists " ... "; - - propertyname = "value"; - propertyname = "value"; - -} ) - - This is encoded by the - -The code(\translator) keyword opens the block for translation (or -context) definition. The code(\type) keyword explains to Lily that -the context should be formed by taking an (empty) instance of -code(Engraver_group_engraver). The code(Engraver_group_engraver) is a -C++ class from the source code to Lily. The code(\accepts) entries -explain what kind of contexts this context could contain. If we were -to define a context for a staff, the definition would typically -contain code(\accepts "Voice";). - -The code(\consists) entries specify which notation constructs should -be handled. This needs a little explanation: LilyPond contains the -code for quite a large number of basic building blocks for notation -generation, and each building block handles only one notation -construct. The name of such a building block is `engraver'. You can -specify which notation construct a context should handle by specifying -which engravers should be part of the context. The code(\consists -"Foobar") entry really means ``add an instance of code(Foobar) to the -translation group.'' - - -For example if this context should print time signatures, the definition -should include `code(\consists "Time_signature_engraver";)'. Again -code(Time_signature_engraver) is a class from the source code of LilyPond. - - - -Finally, one can pre-set some properties in a context definition. - -As a practical example, we will show you how to typeset polymetric -music, i.e., music where the meter can differ for each staff. The -solution is not very complicated: normally all timing information -(time signature, rhythmic grouping) is synchronised across each staff. In -LilyPond this is expressed by having only one registration for timing -information for all staffs. To be precise, there is only one -code(Timing_engraver), and it is located in the top level context, the -code(Score) context. - -All staffs use the information in the global code(Timing_engraver) -for generating bar lines and time signatures. In polymetric music, this timing -information can be different for every staff, so we should redefine -the code(Staff) context to include and the code(Score) context to exclude the -code(Timing_engraver). - -mudela(verbatim)( -polymetricpaper = \paper { - Score = \translator { - \type Score_engraver; - \consists "Score_priority_engraver"; - \consists "Priority_horizontal_align_engraver"; - \consists "Vertical_align_engraver"; - % \consists "Timing_engraver"; % removed Timing_engraver - \accepts "Staff"; - } - - Staff = \translator { - \type "Line_group_engraver_group"; - - defaultclef = violin; - - \consists "Bar_engraver"; - \consists "Clef_engraver"; - \consists "Key_engraver"; - \consists "Local_key_engraver"; - \consists "Time_signature_engraver"; - \consists "Timing_engraver"; % added Timing_engraver - \consists "Staff_sym_engraver"; - \consists "Separating_line_group_engraver"; - - \accepts "Voice"; - } -} -\score { - \melodic < - \type Staff = one { \time 2/4; c'4 c'4 c'4 c'4 c'4 c'4 } - \type Staff = two { \time 3/4; c'4 c'4 c'4 c'4 c'4 c'4 } - > - \paper { \polymetricpaper - linewidth = -1.; - } -} -) - -As you can see, we used the identifier code(polymetricpaper) to break -up the large score block. More of these context definitions appear in -the standard initialisation file file(engraver.ly). - -sect(Urtexts and context selection) -label(tutorial:urtext) - -In bind(Section)ref(tutorial:more-staffs), we have shown you how to make -multiple staffs, and explained that you have to label every staff (or -more precisely: different contexts), to make sure that new ones are -created when you need them. In this section, the real power of this -mechanism will unveiled. - -By naming other contexts that you create, you can reference other contexts -than the current context from within the music. For example, from within the music that you -enter for staff code(One), one could enter a small piece of music, -and send it to staff code(Two), e.g., -mudela(fragment,verbatim)( - < - \type Staff = one { c''4 \type Staff = two { c4 c4 } c''4 } - \type Staff = two { \clef bass; g,4 g,4 g,4 g,4 } - > -) - - -Another useful application of this feature is making Urtexts. -em(Urtext) is the German word for `original text'. The Urtext -edition of a piece of music, is an edition that reflects the original -writing of the composer. Such editions are useful for musicologists, -and performers that want to perform authentic interpretations. However, -for mere mortals, the Urtext can be quite hard to read. It might not -contain fingering and beaming, and typically it is full of footnotes. -Moreover, common interpretations may have emerged---after the composer -died. For this reason, the music that can be had as Urtext usually is also -available in enhanced and edited editions. - -The mechanism of context selection can be used to fabricate an Urtext -and an edited edition from em(one source). We will use the first few -bars of bind(J.)bind(S.)Bach's lovely Cello suite bind(no.)I to -demonstrate this. The example makes heavy use of space rests: a space -rest is a like a rest that doesn't print anything. It can be used as -a placeholder, to attach articulation marks to. It is entered as a -note with the name code(s). - -mudela(verbatim)( - bach = \melodic { [c16 g e' d'] [e' g e' g] } - - staffStuff = \melodic { \clef bass; \time 4/4; s1 \bar "|."; } - - slursOne = \melodic { s16( s s s s16 s s )s } - slursTwo = \melodic { s16-. s s() s s16() s s ()s } - - \score{ - { < \type Voice = celloVoice { \bach \bach } - \type Voice = celloVoice { \slursOne \slursOne } - \staffStuff - > - < - \type Voice = celloVoice { \bach \bach } - \type Voice = celloVoice { \slursTwo \slursTwo } - \staffStuff - > - } - \paper {} - } -) - - The slurs that you define should be put on the music that is defined -by the code(\bach) identifier. By labeling a code(Voice) context, and -directing both the articulation and the notes to that same code(Voice) -context, the articulation is put over the right notes. - - -sect(Transposing) -label(tutorial:more-grammar) - -COMMENT(In this section, we will complete the grammar for Music that was -sketched earlier. ) -One of the things that you can do with music is -em(transposing) it. If you want to transpose a piece of music, then -you should prefix the keyword code(\transpose) along with the pitch -(relative to the central C) for the transposition.footnote(the -code(\type Staff) is to make sure that no separate staffs are created -for the code(\scale) and code(\transpose cis' \scale) part.) - - -mudela(verbatim)( -scale = \melodic \relative c' { [c8 d e f] } -\score { - \melodic { - \type Staff { \scale \transpose cis' \scale } - } - \paper { linewidth = -1.0; } -}) - - -sect(Staff switching) - -We have seen that contexts can be nested. This means that they form a -tree. It is possible to edit this tree: for example, a code(Voice) -context can be taken out of a code(Staff) context, and put into -another. This has the effect of the voice switching staffs (something -that often happens in keyboard music). The syntax for this operation -with these particular contexts is code(\translator Staff = newStaffName). - -The effect is analogous to the first example in section -ref(tutorial:urtext), but with the code(\translator) construction it -is possible to split the real music and the commands that determine in -which staff the music is printed. For example: - -mudela(verbatim)( - -% real music -aVoice = \type Voice = voiceA \melodic { c''4 c4 c4 c''4 } -bVoice = \type Voice = voiceB \melodic { g,4 g,4 g,4 g,4 } - -% staff switching stuff -switch = \type Voice = voiceA \melodic { s4 \translator Staff = staffB s4 - s4 \translator Staff = staffA s4 } - -\score { - < - \type Staff = staffA < \aVoice \switch > - \type Staff = staffB < \bVoice \clef bass; > - > - \paper { linewidth = -1.; } -} -) - -Don't try to switch staffs when you are in the middle of a slur or -beam, though. It doesn't work yet. - -sect(Hairy durations: triplets) - -In the previous section we explained an operation that changes the -pitches of music, transposition. In this section we will explain an -operation that modifies the duration of the notes that you enter. -When notes are part of a triplet, then the real of duration of the -notes are 2/3 part of what their shape indicates: -mudela(fragment)( -\[/3 c'4 c'4 c'4 \]/1 -) - -To support this notion, Mudela allows you to modify the duration of a -note by multiplication or division. A code(c'4) note that would be in a -triplet is written as code(c'4*2/3). If you sequence a few of these -notes, you get a triplet.footnote(We added a normal staff in the example to -show the difference.) -mudela(fragment,verbatim)( -< \type Staff = staffA { c'8*2/3 c'8*2/3 c'8*2/3 c'4} - \type Staff = staffB { c''8 c''8 c''4 } >) - -LilyPond knows that these notes are no normal eighth notes, but the -reader doesn't yet. To help the reader a beam or a bracket with a `3' -should be printed. The special beam command `code([2/3)' and the -matching close beam `code(]1/1)' will take care of that, and -they also abbreviate the code(*2/3) part. If you want brackets in -stead of beams, you can use `code(\[2/3])' and `code(\]1/1)'. -mudela(fragment,verbatim)( -< \type Staff = staffA { - [2/3 c'8 c'8 c'8 ]1/1 - \[2/3 c'8 c'8 c'8 \]1/1 - } - \type Staff = staffB { [c''8 c''8 c''8 c''8] } ->) - -Other tuplets can be entered in the same way. -mudela(fragment,verbatim)( -< \type Staff = staffA { - \time 7/8; - [7/6 c'8 c'8 c'8 c'8 c'8 c'8 ]1/1 - } - \type Staff = staffB { - \time 7/8; - [c''8 c''8 c''8 c''8 c''8 c''8 c''8] } > -) - -For your convenience, code([2/3) can be further abbreviated to code([/3), and -you can abbreviate code(]1/1) on the closing beam marker to code(]/1). - -mudela(fragment,verbatim)( -< \type Staff = staffA { - [/3 c'8 c'8 c'8 ]/1 c'4 - } - \type Staff = staffB { [c''8 c''8] c''4 } > -) - - -bf(Important) the construct with code([/3) and -code([/1) is a hack that sets a mode in the parser. This means that -verb(id = \melodic { c8 c8 c8 } -notATriplet =\melodic { [2/3 \id ]1/1 }) -does not produce a triplet. It will hopefully -soon be replaced by a construction that mixes more elegantly with the -grammar for Music. - - -sect(Shortcuts for octaves) -label(sec:relativeoctaves) - -Plain Mudela contains a lot of quotes to get the octaves right. This -need for quotes can be reduced: most of the pitch intervals in -conventional music are small. Therefore, it makes sense to leave out -the quotes when the interval is small. We have built a mode that does -exactly this. It is called the relative mode for octaves. You can -switch it on by entering code(\relative). Then LilyPond will -interpret every note as if they mean the note with the same name -closest to the previous. You have to specify the first pitch because -the first note of a list obviously has no predecessor. So, you can -enter a scale without using octavation quotes, e.g., - -mudela(fragment,verbatim)( - \relative c' { c d e f g a b c } -) - -For chords, the relative mode works slightly differently. In a -sequence of chords, the first note of a chord gives the starting point -for the next chord. We can demonstrate this with our twinkle twinkle example -verb( - \relative c' { - c4 c <c g'> <c e g> - <c e a> <b d a'> <b2 d g> - <a4 d f> <bes d f> <bes c e> <g c e> - <e a d> <a, g' cis'> <d2 f d'> - } -) - -LilyPond converts any music with code(\relative) prepended to absolute -music immediately when it is read. Internally it is stored it in -absolute pitches. Since the tutorial mainly deals with how to specify -musical information, and not how to enter it conveniently, the -tutorial doesn't use it. - - -sect(Large pieces) -label(tutorial:large-pieces) - -In our quest for a clean and powerfull music language, we took the effort -of entering some larger pieces of music as well. From this we learned -certain things that lead to direct improvements of Mudela, such as the -relative mode. We also gained some practial experience, that resulted in a -compilation of tips that may be of use to you. - -Entering a large piece of music will often imply the need to produce a -conductor's score, as well as individual parts for all instruments. This -can most easily be achieved making use of identifiers and including mudela -files. - -subsect(Identifiers) - -Briefly introduced before, identifiers are your biggest help in structurising -a large piece of music. As an example, we'll consider a string quartet. -In short, it will look like this: verb( - global = \melodic{ } - violinoOne = \melodic \relative c { .. } - violinoTwo = \melodic \relative c { .. } - viola = \melodic \relative c { .. } - violoncello = \melodic \relative c { .. } -) - -The code(\global) part contains everything that is global, i.e., the -same, for each instrument. This may include time signature, key, repeat -signs, different bar types, time signature- and key changes, rehearsal -marks, etc. - -For each instrument, you'll have something vaguely resembling verb( - violinoOneStaff = \type Staff = violinoOne < - \property Staff.midi_instrument = "violin" - \property Staff.instrument = "Violino I" - \property Staff.instr = "Vl. I" - \global - \violinoOne - > -) - - -[Versions, relative mode, - barchecks, splitting of files] - -subsect(Including Mudela files) -ref(subsect:include) - -You can include other Mudela files with the command code(\include): -verb( -\include "paper13.ly" -\score { - ... - \paper { \paper_thirteen } -}) - -The file is looked for in the standard search path. - - -subsect(Grouping of staffs) - -subsect(Versioning) - -sect(Titling) -label(tutorial:titling) - -A piece of sheet music isn't complete without proper opening and -closing titles. LilyPond does not have any real support for setting -text: that is a job best left to TeX(). But you can pass messages to -TeX() from the input file. You can write TeX() macros to handle -these messages. -To do this, you add a code(\header) block -to your input file. The format is quite simple, - -verb( -\header{ - "key" = "value"; - "key" = "value"; - "key" = "value"; - % etc. -}) - -When the results of the music typesetting are output, the contents of -code(\header) are also up into the TeX() file. Tools like -code(ly2dvi) can use this information to generate pretty titling for -your input file. Consult the manual page of code(ly2dvi) for more -details. - - -The code(\header) block should be at toplevel in mudela, and -preferably at the top of the file. If you have an input file with -multiple code(\score) blocks, you should add a header to every score, -describing the different sub parts of the music piece, eg. - - -verb(\header { - "composer" = "Ludwig Van Bavaria"; - "title" = "Symphonie Megalomane"; - } - \score{ - ... % some music - \header { movement = "Mit roher Kraft wild herausfahrend!"; } - \paper { } - } - \score{ - ... % some more music - \header { movement = "Saut\'e comme un oeuf."; } - \paper { } - } -) - -If you want you can also put the code(\header) block at the top of the -input file; it will then be put into every output file automatically. -This will make it clear what the file contains as soon as you open it. - - - -chapter(Features) -label(features) - -bf(This document is not up to date). All rendered examples of course -are current, but the rest probably isn't. Adjusting the tutorial was -considered more important than writing the reference manual. We -apologize for the inconvenience. - - -This document describes the the GNU LilyPond input format, which is an -effective language for defining music. We call this language (rather -arrogantly) The Musical Definition Language or Mudela, for -short.footnote(If anybody comes up with a better name, we'd gladly - take this. Gourlay already uses Musical Description Language, - G-Sharp Score Definition Language. ISO standard 10743 defines a - Standard Music Description Language. We're not being original here.) - -The first aim of Mudela is to define a piece of music, being complete -from both from a musical typesetting, as from a musical performing -point of view. - -The Musical Definition Language (Mudela), has a logical structure, -making use of identifiers, that allows for flexible input, and -definition reuse. See the documentation file file(MANIFESTO), included -with the LilyPond sources for reasons and design considerations. - -The below is included for explanatory purposes only (i.e., for a -complete and up-to-date definition, see file(lily/parser.yy) and -file(lily/lexer.ll)). - -As a related note, you should take a look at the examples and the init -files, as this document does not cover every aspect of Mudela yet, and -may be out of date.footnote(Ok, I am being pessimistic here. This -just is a disclaimer. Docs usually are written after the program -itself.) This document intends to give an idea of how it works. It is -not a guide on how to use it. - -sect(Files) - -The de-facto extension of Mudela is file(.ly). Files may be included by -entering code(\include) at the start of a line: - -verb( -\include "a_file.ly" -) - - -sect(Comments) - -Line comments are introduced by a -code(%). -Block comments are delimited -by -code(%{) -and -code(%}). -They do not nest. - - -sect(Versions) - -Occasionally, small changes in syntax across different versions of -Mudela might give syntax errors. To warn you about possible -incompatibilities, you can specify the Mudela version for which the -inputfile was written, -verb( -\version "0.0.50"; -) - -A Python-script which tries to convert to newer versions -(file(convert-mudela)) is included in the LilyPond distribution. - -sect(Keywords) - -Keywords are preceded by a backslash: code(\). They contain -alphabetic characters only. - - -sect(Nesting characters) - -Mudela uses the brace, `code({)' and `code(})' for most hierarchical -structures. For chords the code(<) and the code(>) are used as -nesting braces. - -sect(Constants) - -verb( -"I am a string" --1.2e3 % a real -12 % an int -) - - -sect(Identifiers) - -When assigning identifiers you use - -verb( -string = ... -) - -If you reuse identifiers, then the previous contents will be thrown -away after the right hand is evaluated, e.g. -verb( -bla = \melodic { \bla } -) -is legal - -When using identifiers they have to be escaped: - -verb( -oboe = \melodic { ... } -\score{ \melodic { \oboe }} -) - -The left-hand part of the assignment is really a string, so -verb( -"Foo bar 4 2 " = \melodic { .. } -) - -is also a valid assignment (but you would have trouble referencing to it) - - -sect(Hierarchical structures) - -The general structure consists of declarations: -verb( -IDENTIFIER = \TYPE{ - <type specific data> -} -) -and instantiations: - -verb( -\TYPE{ <type specific data> } -) - -(Currently, code(\score) is the only type that can be instantiated -at top level.) - -Most instantiations that use an IDENTIFIER are specified as follows: - -verb( -\TYPE{ \IDENTIFIER [...] } -) - -Some exceptions on this rule have been made to prevent inputting -Mudela becoming tedious - -sect(Modes:) - -To simplify different aspects of music definition (entering the notes -and manipulating them) Mudela has a number of different input "modes": - -description( - - -dit(Normal mode) - -At the start of parsing, Mudela assumes normal mode. -In Normal mode, a word is looked up in the following order: -description( -dit(code(word)) string -dit(code("string")) string -dit(code(\word)) keyword, identifier -) -In normal mode, a word is assumed to start with an alphabetic -character, followed by alpha-numeric characters. - -dit(Note mode) Note mode is introduced by the keyword - code(\melodic). In Note mode, a word is looked up in the following - order: -description( -dit(code(word)) notename, string -dit(code("string")) string -dit(code(\word)) keyword, identifier -) - -In Note mode a word is considered to have alphabetic characters only, -so the underscore (_) is invalid. If you accidently mistype a -notename, the parser will assume that you are entering a string (and -it will most likely complain that you should be in code(\lyric) mode to -do lyrics) - - -dit(Lyric mode) Lyrics mode is introduced by the keyword - code(\lyric). Because of the various control characters that can - appear in lyrics, e.g., foreign language accents, the inputting a - string containing these has been made very easy. - -In Lyrics mode, a word is looked up in the following order: -description( -dit(code(word)) string (thus a lyric) -dit(code("string")) string -dit(code(\word)) keyword, identifier -) - -In Lyric mode every sequence of non-digit and non-white characters -starting with an alphabetic character or the _ is considered a word. - -verb( -a&@&@&TSI|{[ % a word -1THtrhortho % not a "word" -Leise DOEXPAND(Fl\)DOEXPAND("u\)ss{}teren meine Sapfe % 4 words -_ _ _ _ % 4 words: 4 spaces -) -) - -These modes are of a lexical nature. Normal and Note mode largely -resemble each other, save the possibility of entering Reals, -meaning of code(_) and the resolution of words - - - - - -Durations are entered as their reciprocal values -mudela(fragment,verbatim,center)( -a'1 a'2 a'4 a a'8 a a'16 a'32 a'64 -) -Notice that you only have to specify the duration when it changes: Lily -assumes a note has the same duration as the previous one. - -Now we can already write a little tune -mudela(fragment,verbatim,center)( -c' d' e' c' | c' d' e' c' | e' f' g'2 -) -As you'll probably have guessed, -the vertical bar code(|) may be used to mark -measures. - -In the scale shown above -we left-out the last c note of the next octave. -Postfixing the pitch with a quote code(') -produces a note by one octave higher -mudela(fragment,verbatim,center)( -c c' c'' -) - -Postfixing the pitch with a comma, code(,) -produces a note by one octave lower -mudela(fragment,verbatim,center)( -a a, a,, -) - -sect(Slurs and Ties) - -A tie connects two adjacent note heads - -mudela(fragment,verbatim,center)( -e' ~ e' -) - -Whereas a slur rather connects `chords', -and tries to avoid crossing stems - -mudela(fragment,verbatim,center)( -e'( )e' -) - -And of course, such a (legato) slur can span several notes -mudela(fragment,verbatim,center)( -c'( d' e' )f' -) - -sect(Beams and Tuplets) - -A beam is -mudela(fragment,verbatim,center)( -[a'8 a'] [a'16 a' a' a'] -) - -Here's a beamed triplet -mudela(fragment,verbatim,center)( -[/3 a'8 a' a']/1 -) - -a triplet without a beam -mudela(fragment,verbatim,center)( -\[/3 a'4 a'8\] -) - -and a combination -mudela(fragment,verbatim,center)( -[/3 a'8 a'16 a'] a'8 \] -) - -Abbreviations -mudela(fragment,verbatim,center)( -c'1:16 [:16 e'1 g'] -) - -mudela(fragment,verbatim,center)( -c'4:32 [:16 c'8 d'8] -) - -sect(Notenames) - -Lily has predefined sets of notenames -for various nop(languages)footnote(These -are Dutch, English, German, Italian and Swedish. -Simply include the language specific init file file(language.ly).). -The default set are the ones we like best are the Dutch notenames. - -A sharp is formed by adding code(is) -mudela(fragment,verbatim,center)( -cis' dis' eis' fis' gis' ais' bis' -) - -and a flat is formed by adding code(es) -mudela(fragment,verbatim,center)( -ces' des' es' fes' ges' as' bes' -) - -With the obvious names for double sharps -mudela(fragment,verbatim)( -cisis' disis' eisis' fisis' gisis' aisis' bisis' -) - -and double flats -mudela(fragment,verbatim)( -ceses' deses' eses' feses' geses' ases' beses' -) - - -There are two special `notenames', the rest -mudela(fragment,verbatim,center)( -r16 [a' a' a'] -) - -and the space -mudela(fragment,verbatim,center)( -a'2 s-"diminuendo" | a' -) - - -sect(Commands) - -mudela(fragment,verbatim,center)( -\clef "bass"; c -) - -and a clef-change -mudela(fragment,verbatim,center)( -\clef "treble"; f' e' \clef "alto"; d' c' -) - -mudela(fragment,verbatim,center)( -\time 3/4; c' g' g' | -) - -mudela(fragment,verbatim,center)( -\key d; -g a b cis' d' e' fis' g' -) -Note how Mudela allows you to -convey a musical message and doesn't force you to produce a list of typesetting commands. -If the music has a code(cis), you type a code(cis). -Depending on the key and context of the note -Lily will determine what accidentals to typeset. - -A reminder accidental can be forced by -using an exclamation mark code(!) -on a pitch a reminder accidental -mudela(fragment,verbatim,center)( -cis' d' e' cis' | c'! d' e' c' | -) - -mudela(fragment,verbatim)( -\time 2/4; -\bar "|:"; c' c' \bar ":|:"; c' c' \bar ":|"; c' c' \bar "|."; -) - -sect(Chords and Voices) - -Here's a simple chord -mudela(fragment,verbatim,center)( -<c e g> -) - -here are a few -mudela(fragment,verbatim,center)( -< - { c'()d'()c' } - { e'()f'()e' } - { g'()a'()g' } -> -) - -and similarly voices -mudela(fragment,verbatim)( -< - { \voiceone c'4 g' c' g' } - { \voicetwo c2 g2 } -> -) - - -sect(A complete example) -COMMENT(%label(se:complete)) - -A Mudela file needs some red tape - -mudela(verbatim)( -\score{ - \melodic { - c' d' e' c' | - c' d' e' c' | - e' f' g'2 | - } -} -) - -sect(Lyrics) - -Lyrics are entered like notes, with pitches substituted -by text. - -All syllables are entered separately, separated by whitespace -verb( -Twin-4 kle4 twin-4 kle4 ... -) - -Two syllables or words that compose a single -duration entry are bound together using an underscore -verb( -He_could4 not4 -) - - -COMMENT( -URG - Fr\`e-4 re Ja- que - Fr\`e- re Ja- que -) - -mudela(verbatim,center)( -\score{ - < - \melodic \transpose c'' { - c d e c | c d e c | - e f g'2 | e'4 f g'2 - \bar "|."; - } - \type Lyrics \lyric{ - DOEXPAND(Fr\)`e-4 re Ja- que - DOEXPAND(Fr\)`e- re Ja- que - Dor- mez vous?2 - Dor-4 mez vous?2 - } - > -} -) - -sect(Composition: forming bigger structures) -label(sec:grammar) - -The computer savy user may be interested in a more formal -specification. We can capture what have learned about forming -sentences in Mudela in a context-free grammar. - -latexcommand(\smallskip) - -table(2)(lll)( - row(cell(em(Music))cell(: em(Note))) - row(cell()cell(code(|) em(Rest))) - row(cell()cell(code(|) code({) em(MusicList) code(}))) - row(cell()cell(code(|) code(<) em(MusicList) code(>))) - row(cell()cell(code(|) em(Command))) - row(cell()cell(code(|) code(\type) em(string) code(=) em(string) em(Music))) - row(cell()cell(;)) - row(cell(em(MusicList))cell(: em(empty))) - row(cell()cell(code(|) em(MusicList) em(Music))) - row(cell()cell(;)) -) - -latexcommand(\smallskip) - - - - - -In mathematics you can form expressions by combining expressions, -which are ultimately some kind of atom or terminal symbol. The same -goes for Mudela: there are some basic building blocks, and by -combining those you create complex music. - -You can combine music in three ways: -itemize( -it()If you enclose a sequence of music-elements in braces ( code({) - and code(}) ), then you form another kind of music called -sequential music - with those pieces. - The duration of sequential composition is the sum of the durations of its elements - verb( - { c c g g a a g2 } % twinkle twinkle - { { c c g g} { a a g2 } } - ) -it()You can stack music by enclosing a sequence of music elements - with code(<) and code(>). This is called simultaneous music. - The duration of a simultaneous composition is the union of the durations - of its elements Example: - verb( - <a4 {cis8 cis8} e'4> % a-major chord - ) -it()You can form music by transposing music: - verb( - \transpose - d % from c to the d that's almost one octave down - { e4 f4 } % the horizontal music -) -it()verb(\type) -it()verb(\property) -it()verb(\translator) -it()verb(\relative) -) - -Of course you can also combine these three mechanisms. -verb( -{ c <c e> <c e g> <c e g \transpose d' dis > } % 4 increasing chords -) - - -sect(Durations) - -A duration always starts with the duration type (1,2,4 etc), and then -any optional multipliers/dots. `Gregrorian' durations can be entered -as follows -verb( -c'\breve -gis'\longa -) - - - -sect(Time signatures/groupings) - -A time signature specification has this form: -verb( -\time 3/4 ; -) - -Rhythmic grouping is a concept closely associated with this. For -example, in a 5/8 time signature, the counts are grouped 2+3. In Mudela this is -entered as -verb( -\grouping 8*2 8*3 ; -) - -You can start the piece with a partial measure, the command takes a -duration as an argument -verb( -\partial 16*3; -) - -Make the piece start with a upstep -lasting 1 3/4 quarter notes. - -These commands constitute `Music', and have a duration of 0. - - -sect(Properties) - -By default the same accidentals are valid for all octaves, but - this can be changed with the property code(specialaccidentals). - - -The identifier code(\specialkey) sets the property for the Staff. A -key with two flats in one octave and three - sharps in the next can be declared with verb(\specialkey -\accidentals bes es fis' cis' gis';) - -sect(Music fragments) -label(tutorial:music-fragments) - -Sometimes you only need to print a small fragment of music, perhaps -something much like one of the examples in this document. Back in -section ref(sec:running-lilypond) we told you that the music you -enter should be encapsulated in something like: -verb( -\score< - \melodic\relative c{ - d - } - \paper{ } - \midi{ } -> -) -where the only interesting information is this particular example is verb( - d -) -The rest of the above example was already nicknamed `red tape'. -You may easily get bored if you have to provide this same red tape -for every fragmenty you nop(try)footnote(Of course, in most cases your -favourite text editor (TM) -will help you out.). - -Luckily there's a trick around this, and it's called file(.fly) files. -If you use the extension file(.fly) for Mudela file file(foo), -LilyPond will embed your file(foo.fly) nop(in)footnote(Or something very -similar. If you want to know exactly, see file(init/init.fly)): -verb( -\score< - \melodic\relative c{ - <<foo.ly>> - } - \paper{ } - \midi{ } -) - -Here's how it works. If you run LilyPond on your file file(bar.ly), you -may notice that she starts-off by reading quite a number of files before -she actually reaches your file(bar.ly). There's no magic going on, Lily -by default reads an initialisation file (file(init/init.ly)). In the -initialisation process a lot of things are defined that you'll need for -normal operation, such as notenames and various other mudela shortcuts, -engraver and perforer definitions, font sizes, musical dimensions and -paper sizes. When you use the extension file(.fly), Lily just starts -reading another initialisation file (file(init/init.fly)), that includes the -red tape for you too. - - -appendix() - -chapter(Glossary) -label(glossary) - -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{vocabulary} - } -)) - -whenhtml( - includeverbatim(DOEXPAND(outdir)/vocabulary.html) -) - -whenlatex(latexcommand( - \bibliographystyle{plain} - \bibliography{engraving} -)) - - -COMMENT(The bib stuff is somewhere else on the WWW site) -COMMENT( -setchapterstring{} - -whenhtml{ - nchapter{Bibliography} - includeverbatim{out-www/engraving.html} -}) - diff --git a/Documentation/tex/refman.yo b/Documentation/tex/refman.yo new file mode 100644 index 0000000000..cf44f1cb42 --- /dev/null +++ b/Documentation/tex/refman.yo @@ -0,0 +1,668 @@ +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(<font color=black>) + +latexpackage()(a4wide) +latexlayoutcmds( +%\usepackage[latin1]{inputenc} +\input mudela-book +) + +whenlatex(notableofcontents()) +whentexinfo(notableofcontents()) + +report(Mudela, reference manual) + (Han-Wen Nienhuys and Jan Nieuwenhuizen) + (nop()PIPETHROUGH(date "+%B %d, %Y")()()nop()) + +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}) +) + + +bf(This document is not up to date). All rendered examples of course +are current, but the rest probably isn't. Adjusting the tutorial was +considered more important than writing the reference manual. We +apologize for the inconvenience. + + +This document describes the the GNU LilyPond input format, which is an +effective language for defining music. We call this language (rather +arrogantly) The Musical Definition Language or Mudela, for +short.footnote(If anybody comes up with a better name, we'd gladly + take this. Gourlay already uses Musical Description Language, + G-Sharp Score Definition Language. ISO standard 10743 defines a + Standard Music Description Language. We're not being original here.) + +The first aim of Mudela is to define a piece of music, being complete +from both from a musical typesetting, as from a musical performing +point of view. + +The Musical Definition Language (Mudela), has a logical structure, +making use of identifiers, that allows for flexible input, and +definition reuse. See the documentation file file(MANIFESTO), included +with the LilyPond sources for reasons and design considerations. + +The below is included for explanatory purposes only (i.e., for a +complete and up-to-date definition, see file(lily/parser.yy) and +file(lily/lexer.ll)). + +As a related note, you should take a look at the examples and the init +files, as this document does not cover every aspect of Mudela yet, and +may be out of date.footnote(Ok, I am being pessimistic here. This +just is a disclaimer. Docs usually are written after the program +itself.) This document intends to give an idea of how it works. It is +not a guide on how to use it. + +sect(Files) + +The de-facto extension of Mudela is file(.ly). Files may be included by +entering code(\include) at the start of a line: + +verb( +\include "a_file.ly" +) + + +sect(Comments) + +Line comments are introduced by a +code(%). +Block comments are delimited +by +code(%{) +and +code(%}). +They do not nest. + + +sect(Versions) + +Occasionally, small changes in syntax across different versions of +Mudela might give syntax errors. To warn you about possible +incompatibilities, you can specify the Mudela version for which the +inputfile was written, +verb( +\version "0.0.50"; +) + +A Python-script which tries to convert to newer versions +(file(convert-mudela)) is included in the LilyPond distribution. + +sect(Keywords) + +Keywords are preceded by a backslash: code(\). They contain +alphabetic characters only. + + +sect(Nesting characters) + +Mudela uses the brace, `code({)' and `code(})' for most hierarchical +structures. For chords the code(<) and the code(>) are used as +nesting braces. + +sect(Constants) + +verb( +"I am a string" +-1.2e3 % a real +12 % an int +) + + +sect(Identifiers) + +When assigning identifiers you use + +verb( +string = ... +) + +If you reuse identifiers, then the previous contents will be thrown +away after the right hand is evaluated, e.g. +verb( +bla = \melodic { \bla } +) +is legal + +When using identifiers they have to be escaped: + +verb( +oboe = \melodic { ... } +\score{ \melodic { \oboe }} +) + +The left-hand part of the assignment is really a string, so +verb( +"Foo bar 4 2 " = \melodic { .. } +) + +is also a valid assignment (but you would have trouble referencing to it) + + +sect(Hierarchical structures) + +The general structure consists of declarations: +verb( +IDENTIFIER = \TYPE{ + <type specific data> +} +) +and instantiations: + +verb( +\TYPE{ <type specific data> } +) + +(Currently, code(\score) is the only type that can be instantiated +at top level.) + +Most instantiations that use an IDENTIFIER are specified as follows: + +verb( +\TYPE{ \IDENTIFIER [...] } +) + +Some exceptions on this rule have been made to prevent inputting +Mudela becoming tedious + +sect(Modes:) + +To simplify different aspects of music definition (entering the notes +and manipulating them) Mudela has a number of different input "modes": + +description( + + +dit(Normal mode) + +At the start of parsing, Mudela assumes normal mode. +In Normal mode, a word is looked up in the following order: +description( +dit(code(word)) string +dit(code("string")) string +dit(code(\word)) keyword, identifier +) +In normal mode, a word is assumed to start with an alphabetic +character, followed by alpha-numeric characters. + +dit(Note mode) Note mode is introduced by the keyword + code(\melodic). In Note mode, a word is looked up in the following + order: +description( +dit(code(word)) notename, string +dit(code("string")) string +dit(code(\word)) keyword, identifier +) + +In Note mode a word is considered to have alphabetic characters only, +so the underscore (_) is invalid. If you accidently mistype a +notename, the parser will assume that you are entering a string (and +it will most likely complain that you should be in code(\lyric) mode to +do lyrics) + + +dit(Lyric mode) Lyrics mode is introduced by the keyword + code(\lyric). Because of the various control characters that can + appear in lyrics, e.g., foreign language accents, the inputting a + string containing these has been made very easy. + +In Lyrics mode, a word is looked up in the following order: +description( +dit(code(word)) string (thus a lyric) +dit(code("string")) string +dit(code(\word)) keyword, identifier +) + +In Lyric mode every sequence of non-digit and non-white characters +starting with an alphabetic character or the _ is considered a word. + +verb( +a&@&@&TSI|{[ % a word +1THtrhortho % not a "word" +Leise DOEXPAND(Fl\)DOEXPAND("u\)ss{}teren meine Sapfe % 4 words +_ _ _ _ % 4 words: 4 spaces +) +) + +These modes are of a lexical nature. Normal and Note mode largely +resemble each other, save the possibility of entering Reals, +meaning of code(_) and the resolution of words + + + + + +Durations are entered as their reciprocal values +mudela(fragment,verbatim,center)( +a'1 a'2 a'4 a a'8 a a'16 a'32 a'64 +) +Notice that you only have to specify the duration when it changes: Lily +assumes a note has the same duration as the previous one. + +Now we can already write a little tune +mudela(fragment,verbatim,center)( +c' d' e' c' | c' d' e' c' | e' f' g'2 +) +As you'll probably have guessed, +the vertical bar code(|) may be used to mark +measures. + +In the scale shown above +we left-out the last c note of the next octave. +Postfixing the pitch with a quote code(') +produces a note by one octave higher +mudela(fragment,verbatim,center)( +c c' c'' +) + +Postfixing the pitch with a comma, code(,) +produces a note by one octave lower +mudela(fragment,verbatim,center)( +a a, a,, +) + +sect(Slurs and Ties) + +A tie connects two adjacent note heads + +mudela(fragment,verbatim,center)( +e' ~ e' +) + +Whereas a slur rather connects `chords', +and tries to avoid crossing stems + +mudela(fragment,verbatim,center)( +e'( )e' +) + +And of course, such a (legato) slur can span several notes +mudela(fragment,verbatim,center)( +c'( d' e' )f' +) + +sect(Beams and Tuplets) + +A beam is +mudela(fragment,verbatim,center)( +[a'8 a'] [a'16 a' a' a'] +) + +Here's a beamed triplet +mudela(fragment,verbatim,center)( +[/3 a'8 a' a']/1 +) + +a triplet without a beam +mudela(fragment,verbatim,center)( +\[/3 a'4 a'8\] +) + +and a combination +mudela(fragment,verbatim,center)( +[/3 a'8 a'16 a'] a'8 \] +) + +Abbreviations +mudela(fragment,verbatim,center)( +c'1:16 [:16 e'1 g'] +) + +mudela(fragment,verbatim,center)( +c'4:32 [:16 c'8 d'8] +) + +sect(Notenames) + +Lily has predefined sets of notenames +for various nop(languages)footnote(These +are Dutch, English, German, Italian and Swedish. +Simply include the language specific init file file(language.ly).). +The default set are the ones we like best are the Dutch notenames. + +A sharp is formed by adding code(is) +mudela(fragment,verbatim,center)( +cis' dis' eis' fis' gis' ais' bis' +) + +and a flat is formed by adding code(es) +mudela(fragment,verbatim,center)( +ces' des' es' fes' ges' as' bes' +) + +With the obvious names for double sharps +mudela(fragment,verbatim)( +cisis' disis' eisis' fisis' gisis' aisis' bisis' +) + +and double flats +mudela(fragment,verbatim)( +ceses' deses' eses' feses' geses' ases' beses' +) + + +There are two special `notenames', the rest +mudela(fragment,verbatim,center)( +r16 [a' a' a'] +) + +and the space +mudela(fragment,verbatim,center)( +a'2 s-"diminuendo" | a' +) + + +sect(Commands) + +mudela(fragment,verbatim,center)( +\clef "bass"; c +) + +and a clef-change +mudela(fragment,verbatim,center)( +\clef "treble"; f' e' \clef "alto"; d' c' +) + +mudela(fragment,verbatim,center)( +\time 3/4; c' g' g' | +) + +mudela(fragment,verbatim,center)( +\key d; +g a b cis' d' e' fis' g' +) +Note how Mudela allows you to +convey a musical message and doesn't force you to produce a list of typesetting commands. +If the music has a code(cis), you type a code(cis). +Depending on the key and context of the note +Lily will determine what accidentals to typeset. + +A reminder accidental can be forced by +using an exclamation mark code(!) +on a pitch a reminder accidental +mudela(fragment,verbatim,center)( +cis' d' e' cis' | c'! d' e' c' | +) + +mudela(fragment,verbatim)( +\time 2/4; +\bar "|:"; c' c' \bar ":|:"; c' c' \bar ":|"; c' c' \bar "|."; +) + +sect(Chords and Voices) + +Here's a simple chord +mudela(fragment,verbatim,center)( +<c e g> +) + +here are a few +mudela(fragment,verbatim,center)( +< + { c'()d'()c' } + { e'()f'()e' } + { g'()a'()g' } +> +) + +and similarly voices +mudela(fragment,verbatim)( +< + { \voiceone c'4 g' c' g' } + { \voicetwo c2 g2 } +> +) + + +sect(A complete example) +COMMENT(%label(se:complete)) + +A Mudela file needs some red tape + +mudela(verbatim)( +\score{ + \melodic { + c' d' e' c' | + c' d' e' c' | + e' f' g'2 | + } +} +) + +sect(Lyrics) + +Lyrics are entered like notes, with pitches substituted +by text. + +All syllables are entered separately, separated by whitespace +verb( +Twin-4 kle4 twin-4 kle4 ... +) + +Two syllables or words that compose a single +duration entry are bound together using an underscore +verb( +He_could4 not4 +) + + +COMMENT( +URG + Fr\`e-4 re Ja- que + Fr\`e- re Ja- que +) + +mudela(verbatim,center)( +\score{ + < + \melodic \transpose c'' { + c d e c | c d e c | + e f g'2 | e'4 f g'2 + \bar "|."; + } + \type Lyrics \lyric{ + DOEXPAND(Fr\)`e-4 re Ja- que + DOEXPAND(Fr\)`e- re Ja- que + Dor- mez vous?2 + Dor-4 mez vous?2 + } + > +} +) + +sect(Composition: forming bigger structures) +label(sec:grammar) + +The computer savy user may be interested in a more formal +specification. We can capture what have learned about forming +sentences in Mudela in a context-free grammar. + +latexcommand(\smallskip) + +table(2)(lll)( + row(cell(em(Music))cell(: em(Note))) + row(cell()cell(code(|) em(Rest))) + row(cell()cell(code(|) code({) em(MusicList) code(}))) + row(cell()cell(code(|) code(<) em(MusicList) code(>))) + row(cell()cell(code(|) em(Command))) + row(cell()cell(code(|) code(\type) em(string) code(=) em(string) em(Music))) + row(cell()cell(;)) + row(cell(em(MusicList))cell(: em(empty))) + row(cell()cell(code(|) em(MusicList) em(Music))) + row(cell()cell(;)) +) + +latexcommand(\smallskip) + + + + + +In mathematics you can form expressions by combining expressions, +which are ultimately some kind of atom or terminal symbol. The same +goes for Mudela: there are some basic building blocks, and by +combining those you create complex music. + +You can combine music in three ways: +itemize( +it()If you enclose a sequence of music-elements in braces ( code({) + and code(}) ), then you form another kind of music called +sequential music + with those pieces. + The duration of sequential composition is the sum of the durations of its elements + verb( + { c c g g a a g2 } % twinkle twinkle + { { c c g g} { a a g2 } } + ) +it()You can stack music by enclosing a sequence of music elements + with code(<) and code(>). This is called simultaneous music. + The duration of a simultaneous composition is the union of the durations + of its elements Example: + verb( + <a4 {cis8 cis8} e'4> % a-major chord + ) +it()You can form music by transposing music: + verb( + \transpose + d % from c to the d that's almost one octave down + { e4 f4 } % the horizontal music +) +it()verb(\type) +it()verb(\property) +it()verb(\translator) +it()verb(\relative) +) + +Of course you can also combine these three mechanisms. +verb( +{ c <c e> <c e g> <c e g \transpose d' dis > } % 4 increasing chords +) + + +sect(Durations) + +A duration always starts with the duration type (1,2,4 etc), and then +any optional multipliers/dots. `Gregrorian' durations can be entered +as follows +verb( +c'\breve +gis'\longa +) + + + +sect(Time signatures/groupings) + +A time signature specification has this form: +verb( +\time 3/4 ; +) + +Rhythmic grouping is a concept closely associated with this. For +example, in a 5/8 time signature, the counts are grouped 2+3. In Mudela this is +entered as +verb( +\grouping 8*2 8*3 ; +) + +You can start the piece with a partial measure, the command takes a +duration as an argument +verb( +\partial 16*3; +) + +Make the piece start with a upstep +lasting 1 3/4 quarter notes. + +These commands constitute `Music', and have a duration of 0. + + +sect(Properties) + +By default the same accidentals are valid for all octaves, but + this can be changed with the property code(specialaccidentals). + + +The identifier code(\specialkey) sets the property for the Staff. A +key with two flats in one octave and three + sharps in the next can be declared with verb(\specialkey +\accidentals bes es fis' cis' gis';) + +sect(Music fragments) +label(tutorial:music-fragments) + +Sometimes you only need to print a small fragment of music, perhaps +something much like one of the examples in this document. Back in +section ref(sec:running-lilypond) we told you that the music you +enter should be encapsulated in something like: +verb( +\score< + \melodic\relative c{ + d + } + \paper{ } + \midi{ } +> +) +where the only interesting information is this particular example is verb( + d +) +The rest of the above example was already nicknamed `red tape'. +You may easily get bored if you have to provide this same red tape +for every fragmenty you nop(try)footnote(Of course, in most cases your +favourite text editor (TM) +will help you out.). + +Luckily there's a trick around this, and it's called file(.fly) files. +If you use the extension file(.fly) for Mudela file file(foo), +LilyPond will embed your file(foo.fly) nop(in)footnote(Or something very +similar. If you want to know exactly, see file(init/init.fly)): +verb( +\score< + \melodic\relative c{ + <<foo.ly>> + } + \paper{ } + \midi{ } +) + +Here's how it works. If you run LilyPond on your file file(bar.ly), you +may notice that she starts-off by reading quite a number of files before +she actually reaches your file(bar.ly). There's no magic going on, Lily +by default reads an initialisation file (file(init/init.ly)). In the +initialisation process a lot of things are defined that you'll need for +normal operation, such as notenames and various other mudela shortcuts, +engraver and perforer definitions, font sizes, musical dimensions and +paper sizes. When you use the extension file(.fly), Lily just starts +reading another initialisation file (file(init/init.fly)), that includes the +red tape for you too. + diff --git a/Documentation/tex/tutorial.yo b/Documentation/tex/tutorial.yo new file mode 100644 index 0000000000..c7fe41086e --- /dev/null +++ b/Documentation/tex/tutorial.yo @@ -0,0 +1,1995 @@ +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(<font color=black>) + +latexpackage()(a4wide) +latexlayoutcmds( +%\usepackage[latin1]{inputenc} +\input mudela-book +) + +whenlatex(notableofcontents()) +whentexinfo(notableofcontents()) + +article(Mudela, the Music-Definition Language) + (Han-Wen Nienhuys and Jan Nieuwenhuizen) + (nop()PIPETHROUGH(date "+%B %d, %Y")()()nop()) + +COMMENT( + +* paragraphs have too much space. + +) + + +latexcommand(\def\interexample{}) +latexcommand(\def\preexample{\par}) +latexcommand(\def\postexample{\par\medskip}) +latexcommand(\def\file#1{{code(#1)}}) + +whenhtml( +nsubsect(Disclaimer) +This document is written in url(Yodl)(ftp://pcnov095.win.tue.nl/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(). +) + +sect(Introduction) +label(tutorial:introduction) +latexcommand(\parindent2pc) + +If you are reading this, you probably are interested in printing +music. LilyPond is a program that can print music from a +specification that you, the user, supply. Using LilyPond may be a bit +quaint in the beginning, because you have to give that specification +using a em(language). That might not be what you expect if you are +familiar with graphical interfaces. But there are some big +advantages: first, once you master the language, entering music can be +done quite efficiently. Secondly, it is possible to explain exactly +what the meaning of a language is, i.e., the semantics are much +clearer. Thirdly, since the program is not interactive, no tradeoffs +have to be made between processing speed and beauty of the output. + +This chapter is a gentle introduction to Mudela, the language that +instructs LilyPond to typeset music. We will explain Mudela by +presenting a series of examples of Mudela input. The corresponding +output will be shown on the right or below, just as it was produced by +LilyPond. + +We will assume that you more or less understand the basics of music notation. +If you are not familiar with the English terms for music notation, you +should consult bind(Appendix)ref(glossary): it contains a glossary +of musical terms along with translations in some other languages. + +If you want to try the examples given here, you should have look a +look at bind(Section)ref(sec:running-lilypond) first. + +sect(Music copying, music definition and music entry) +label(tutorial:copying-vs-def-vs-entry) + +If you have copied music before, using LilyPond may seem awkward +to you in the beginning. The purpose of LilyPond informally is +explained by the term `music typesetter'. + +This may give the impression that the program is like a drawing tool +and that it lets you control precisely how the music is formatted. +This is not the case: not only does the program print musical symbols, +LilyPond also tries to make esthetic decisions---to be precise, we +programmed her to do what we find nop(pretty.)footnote(We formed our +taste by looking at, and reading all about fine music engraving. Of +course, our taste is also bound by all the accepted rules of common +music notation.) You do not have complete control over what is +happening. Usually that is not a big loss, since good engraving is a +very complex trade. In other words, you don't have control, so you do +not have to worry about what is happening precisely. + +Secondly, we expect you to enter the meaning of the music, not the +sheet music itself. The input to LilyPond is a music definition, +which is something different than notation: notation is a graphical +system. Put more concretely: your input to LilyPond should contain +information like ``a dotted quarter note, pitch nop(d)sups(2).'' +LilyPond will figure out from the musical information that a black +note head with a stem but without flag, fourth staff line, with dot +should be printed. + +When you are copying music by hand from a printed score, you don't have +to know what the score means; you just copy the symbols. With LilyPond +such a thing is not possible. You have to enter the meaning of the +symbols, and this might not always be as easy. On the other hand, once +entered, any piece of music can be played and transposed automatically. + +Finally, in some spots we will cheat a bit when it comes to musical +definition. Mudela has some entry modes that help to make typing +Mudela pleasant. For example, the phrase ``a dotted quarter note, +pitch nop(d)sups(2)'' translates to the following longhand: +verb( +\musicalpitch { 1 2 0 } \duration { 2 1 }) + +This data is what we consider the musical em(definition). Mudela +has a special entry mode where you can conveniently abbreviate this to +`code(d''4.)'. There are some features that also make the quotes and +numbers in `code(d''4.)' superfluous in some cases. + +For those who are curious, the numbers in `code(\musicalpitch { 1 2 0 +})' example mean octave, notename, and accidental respectively. The +numbers in `code(\duration { 2 1 })' are the (negative) logarithm of the +duration (2 is a quarter note, 3 is an eighth note, etc.) and the number +of augmention dots respectively. + +sect(When you know the notes to nop(print)ellipsis()) + +The basic building block of music is the note. You can have LilyPond +print a note by specifying its pitch and duration. The pitch of the +central C is written as code(c'). This is in line with musicological +notation; there this pitch is transcribed as nop(c)sups(1) or c'. A +quarter-note duration is written as code(4). So, to print a quarter +note whose pitch is central C, you enter the following: +mudela(fragment,verbatim,center)( c'4 ) + + +subsect(Duration) + +The duration of a note is specified as a number: a whole note is +denoted by 1, a half note by 2, a quarter by 4, and so on. If you +want to augment a duration with a dot, simply affix a period to the +number. Here are some random notes to show how it works. + +mudela(fragment,verbatim)( + c'1 c'2 c'4 c'8 c'16 c'32 c'64 c'64 c'2. c'8. c'16 +) + +subsect(Basic pitches) + +The pitch code(c') actually consists of two parts: one part for the +note name, and one for the octave. The letter specifies which note +name to use: note names simply are the letters code(a) to code(g). +The number of apostrophes specifies the octave to use: the central C +is denoted by code(c').footnote(By convention, the A above central C +at concert pitch is the tone that is used to tune instruments. Its +frequency is about 440 Hz.) The C which is an eighth higher (the C in +the ``two-line octave'') is denoted by code(c''): every octave adds a +quote. A note name without quotes designates the pitch below code(c') +(the C in the ``small octave''). If you want to go down even further, +commas should be added, e.g., the C in the ``contra octave'' is +expressed as code(c,,).footnote(The comma is meant to represent a +sunken apostrophe.) + + +This example demonstrates octaves: +mudela(fragment,verbatim,center)( + c,,4 c,4 c4 c'4 c''4 c'''4 +) + +And this example demonstrates notenames: +mudela(center,fragment,verbatim)( + c'4 d'4 e'4 f'4 g'4 a'4 b'4 c''4 +) + +A rest can be entered as a note with the special name code(r), e.g., +mudela(fragment,verbatim,center)(r4) + +This already gives us enough material to make simple songs. In +bind(Figure)ref(fig:twinkle1) a portion of the traditional song +``Twinkle Twinkle Little Star'' is shown. + +latexcommand(\begin{figure}[h]) + center( +mudela(fragment,verbatim)( + c''4 c''4 g''4 g''4 + a''4 a''4 g''2 +) + latexcommand(\caption{Twinkle twinkle little star (version 1)}) + label(fig:twinkle1) + ) +latexcommand(\end{figure}) + + +subsect(Alterations) + +We have so far ignored chromatically altered pitches. The names `a' +to `g' for entering pitches are convenient: they are short, +pronounceable and they resemble the words for pitches in normal +musical vocabulary. + +Enter flats and sharps. In English there is no standard terse word +for C sharp or C flat. For this reason, we implemented a different, +non-English convention for entering altered pitches: a note is made +sharp by adding the suffix `--is' to its name, and flat by adding the +suffix `--es'. For a double sharp another `--is' suffix is added, for +flats another `--es' suffix. The names for the alterations of C are +given in bind(Table)ref(notename-tab). + +latexcommand(\begin{table}[h]) + center( + table(2)(ll)( + row(cell(english)cell(LilyPond)) + rowline() + row(cell(c double flat)cell(ceses)) + row(cell(c flat)cell(ces)) + row(cell(c natural)cell(c)) + row(cell(c sharp)cell(cis)) + row(cell(c double sharp)cell(cisis)) + ) + ) + latexcommand(\caption{Default note names}) + label(notename-tab) +latexcommand(\end{table}) + +Variations on this convention are used in a number of germanic +languages, notably Dutch, German, Swedish, and Norwegian. To be +precise, LilyPond actually defaults to Dutch notenames, with +code(aes), code(aeses), code(ees) and code(eeses) added for +consistency. + +Throughout this document we will continue to use the Dutch names. To make +(Dutch) pronunciation easier, the a-flat and e-flat are contracted to +code(as) and code(es). Similarly, the a double flat and e double flat are +contracted to code(ases) and code(eses). + +If you are not comfortable with these names, you can make your own. +Note names for different languages are included with the example +initialisation files, amongst others English (C sharp is abbreviated +to code(cs)), Italian, Swedish and Norwegian. If you want to use +these names, you should look at bind(Section)ref(subsect:include) for +information on how to use include files. + +sect(Running LilyPond) +label(sec:running-lilypond) + +In the previous section some basic elements of Mudela were presented. +We didn't want to bore you too much with repetitive details, so we +left out some red tape that's needed for a of Mudela in a form that is accepted +by LilyPond. To +be precise, we wrote code(X Y Z), when we really meant +verb(\score { + \melodic { X Y Z } + \paper {} +}) +We will continue to leave out the red tape this, until the time is fit to explain what the +above it means. + + +Because LilyPond uses a language, it is a so called em(batch) +program. +This means, that you use a +text editor (such as code(emacs) or code(vi)) to create an input +file. When you are done editing your input file, you save it, and you +run LilyPond on the file. If Lily finds any errors in your input file +then nop(she)footnote(We're sure that if computer programs could have + gender, LilyPond would be a female computer program. So we will + refer to the program as a she. This gender-bending is not to tease + you, dear reader. We do it in real life as well. In the past two + years LilyPond has become sort of a baby daughter to us, keeping us + awake at night, but also providing us with lots of joy. We hope you do + not mind our little aberration from the traditions of computer-manual + writing.) COMMENT( + The name LilyPond is actually sort of a girl's name. Can you guess which + one ?) +will complain. If everything went well, then she'll generate a file, that +you can process further to view or print. + +Using LilyPond to print or view some music is a four-step procedure. +To get you started we'll run down the full procedure for you once. + +enumerate( +it() +Fire up your favourite editor (if you don't +know any editors, try code(joe silly.ly)), +and key in the example from bind(Figure)ref(fig:twinkle1), with red tape: +verb( +\score { + \melodic { + c''4 c''4 g''4 g''4 + a''4 a''4 g''2 + } + \paper {} +} +) + +Save your file as file(twinkle.ly).footnote(The default extension for Mudela +files is file(.ly).) + +it() +Run LilyPond on your newly created file: enter code(lilypond twinkle). +LilyPond will then print all kinds of mumbo jumbo that can safely be +ignored. You might see something like this: +verb( +GNU LilyPond 0.1.55/FlowerLib 1.1.39 +Parsing ... [/home/hanwen/musix/spacer/init/lily-init.ly[/home/hanwen/ + + ... stuff left out here ... + + ] Documentation/twinkle.ly] +Interpreting music ...[1] (time: 0.04 seconds) +Preprocessing elements... +Calculating column positions ... [2] +Approximated: 1 lines, (with an average of 4.0 columns) +Time: 0.01 seconds +warning: Can not solve this casting problem exactly; revert to Word_wrap +[2]Time: 0.00 seconds + +Postprocessing elements... +TeX output to twinkle.tex ... +) + +All has gone well; there were some warnings but no errors. The run +resulted in output, a TeX file called file(twinkle.tex). + +file(TeX) is usually spelled TeX(). It is a batch program for +typesetting text. It was developed by the great programmer and +scientist Donald Knuth to typeset his famous bookseries em(The Art of +Computer Programming). As you can see, TeX() can be adapted to do a +lot more. whenlatex(In fact, the document that you are reading now was also +produced with TeX().) COMMENT(ugh.) + + +it() + To do something useful with the output you have to run TeX() on it + first. Run the command code(tex twinkle). The output should resemble this: +verb( +This is TeX, Version 3.14159 (C version 6.1) +(twinkle.tex +Babel <v3.6h> and hyphenation patterns for american, dutch, loaded. +(/home/hanwen/lib/texmf/tex/lilypond/lilyponddefs.tex +(/home/hanwen/lib/texmf/tex/lilypond/dyndefs.tex) +(/home/hanwen/lib/texmf/tex/lilypond/fetdefs.tex +(/home/hanwen/lib/texmf/tex/lilypond/feta20.tex) +(/home/hanwen/lib/texmf/tex/lilypond/lily-ps-defs.tex))) [1] ) +Output written on twinkle.dvi (1 page, 3084 bytes). +Transcript written on twinkle.log. +) + The human translation is ``everything went OK, the result is one + page long, and I put it in file(twinkle.dvi).'' + +it()The file(twinkle.dvi) file is a description of how a piece of +text looks when it is printed. You can view it, or print it. If you +are using a Unix system equipped with X-Windows, then you can issue +the command file(xdvi twinkle) to view the result. If this is not the +case, consult your local TeX() guru on printing and viewing DVI files. +What is in your window should approximately look like this: +mudela()( +\score { + \melodic { + c''4 c''4 g''4 g''4 + a''4 a''4 g''2 + } + \paper { linewidth = 13.\cm; } +} +) + +it() +If you want to print file(twinkle.dvi), you should invoke the command +code(dvips twinkle). Running this command should generate a +PostScript file called file(twinkle.ps). This file can be printed on +any PostScript compatible printer. You should not use any other +tools: the output from LilyPond contains fragments of PostScript which +will not print correctly if you don't use PostScript. If your printer +doesn't understand PostScript, you should check out GhostScript, a +PostScript emulator. +) + + + +The four-pass procedure sketched above is a bit clumsy. Moreover, the +result is pretty crude: the page does not include prettily printed +titles and if you are unlucky, the margins don't come out well. Jan +Arne Fagertun wrote a tool to take the above steps out of your hands, +make neat margins and print titling. The tool is called file(ly2dvi), +and it should be on your system if you use Lily on a Unix platform. +If you use file(ly2dvi), then you can do verb(ly2dvi twinkle.ly ) in +stead of steps 2 and 3. You will feel the real advantage of using +file(ly2dvi) when you add titling to the music. This is something +that we will discuss in bind(Section)ref(tutorial:titling). + + +COMMENT(This document does not cover all of Mudela. Due to technical details, +the precise working of Mudela is coupled to the innards of LilyPond. +If you really want to know all the details, your best bet would be to +get the sources to LilyPond and read the parser and scanner source. +They are in file(lilypond-x.y.z/lily/parser.yy) and +file(lilypond-x.y.z/lily/lexer.ll).) + + + +sect(Chords) + +Up till now we have only considered music that was rather simple. All +the music had notes going in one direction, from left to right, one +note following the other. You might be wondering if this is all Lily +can do, or whether it is possible to stack notes as well (creating +em(chords)). Rest assured: we designed LilyPond while keeping in mind +that she must be able to handle any notation construct that can be +expressed conveniently. Of course we did not leave out chords. + +In Mudela you can form a chord of several notes by enclosing them in +pointed parentheses, bind(i.e.)bind(langle())bind(and)rangle(). ASCII +doesn't really have these delimiters, so Mudela uses the larger-than +(code(>)) and smaller-than (code(<)) signs instead. For example, a +D-major nop(chord)footnote(Recall what was said in the previous +section about flats and sharps: the word code(fis) means an f sharp.) +can be described by the following fragment: +mudela(fragment,verbatim,center)( + <d'8 fis'8 a'8 d''8> +) + + Chords can be entered in the music in the same places that notes +can. As an example we give a snippet of ``Twinkle Twinkle Little +Star'' in chords. The chords may seem, slightly unconventional, but they +only serve to show how chords work. We've aligned the chords +in the input on their starting beat just to help you reading it. +This layout does not influence the typesetting result in any way. + +mudela(verbatim, fragment)( + c''4 c''4 <c''4 g''4> <c''4 e''4 g''4> + <c''4 e''4 a''4> <b'4 d''4 a''4> <b'2 d''2 g''2> + <a'4 d''4 f''4> <bes'4 d''4 f''4> <bes'4 c''4 e''4> <g'4 c''4 e''4> + <e'4 a'4 d''4> <a4 g'4 cis''4> <d'2 f'2 d''2> +) + + + +sect(Shortcuts for duration) + +If you typed the last example into a Mudela file, you will have +noticed that the input has lots of repetitions. You will probably +have made some errors with the right durations and number of +octavation quotes. +To save keystrokes and prevent errors Mudela +has some handy shortcuts. The simplest is the shortcut for +durations. You don't have to type the duration if it +is the same as the last duration entered. This saves a considerable +number of keystrokes, and thus reduces the potential for errors. The +previous example can be reduced to verb( + c''4 c'' <c'' g''> <c'' e'' g''> + <c'' e'' a''> <b' d'' a''> <b'2 d'' g''> + <a'4 d'' f''> <bes' d'' f''> <bes' c'' e''> <g' c'' e''> + <e' a' d''> <a g' cis''> <d'2 f' d''> +) + + +If you entered this, you probably made some little errors with the +right amount of quotes as well. To remedy this, mudela has another +feature called `relative octaves', which reduces the amount of quotes +needed. If you want to enter large pieces of music em(now) we +recommend you make an excursion to +bind(Section)ref(sec:relativeoctaves) and learn about relative +octaves. + + + +sect(Comments) + +If you want to make some private notes about the Mudela code that you +entered, you can do so by inserting comments into your file. The +contents of these comments are ignored by LilyPond. Mudela has two comment +styles: line comments and block comments. The line comment +is introduced by the percent sign: +verb( + c''4 + c''4 % shouldn't this be a different pitch? +) + +Block comments are enclosed in code(%{) and code(%}). + +verb( + c''4 + %{ + Ludwig van Bavaria's original manuscript has an fffff dynamic sign. + Clearly one can see the onset of paranoid schizophrenia in the + composer from these subtle nuances in his writings. + %} + c''4 +) + + +sect(Adding nuances: articulation and dynamics) + +Having just chords and notes does not give you real music. Real music +has more liveliness to it: music can have articulation, dynamics +(louder and softer), etc. This liveliness has notation, so LilyPond +can print it. We'll start out by explaining how to obtain the +smallest grains of nuance: the articulation of a single note. Articulation +is entered by writing a dash and the name of the desired articulation +mark. You have to add a backslash in front of the name to distinguish +it from the name of a note. mudela(fragment,verbatim)( + c''4-\staccato + c''4-\tenuto ) + +Typing a lot of staccato notes in this syntax will get tedious very +quickly. Therefore, Mudela has some handy abbreviations for +articulation marks such as staccato and tenuto. They are shown in the +following example: + +mudela()( +\score{ \melodic { + \property Voice.textstyle = typewriter + c''4-._"c''4-." s4 + c''4--_"c''4--" s4 + c''4-+_"c''4-+" s4 + c''4-|_"c''4-|" s4 + c''4->_"c''4->" s4 + c''4-^_"c''4-\\^{ }" s4 } + \paper { linewidth = 12.\cm; }}) + + + +Text and digits for fingering can be entered in the same manner: add a +dash and the text or digit to be printed: +mudela(fragment,verbatim)( + c''4-1 g''4-5 c''-"Sul tasto" ) +Currently, the meaning of the +syntax `note-dash-digit/articulation/text' is just ``add a superscript to this +note.'' This is not in line with our goal to em(define) music with +Mudela. We hope that this will be fixed in a future version of the +language. In the meantime you can abuse this: the super- and +subscripts can be forced into up or down position respectively by entering an +a caret (code(^)) or an underscore, code(_) instead of the dash: +mudela(fragment,verbatim,center)( + c'4-^ c'4^^ c'''4-^ c'''4_^ +) + +Dynamic markings are another way to add a nuance to a note. They are +entered by adding the name for the dynamic sign after the note. You +should not enter a dash between the name and the note.footnote(This + is inconsistent. We hope that this will be fixed in a later + version of the language.) +mudela(verbatim,fragment)( + c4 \ff c4 \fp c4 c4 \ppp c4 c4 \sfz +) +COMMENT(UGH) + +sect(Bridging the notes: beams, slurs and ties) + +Up till now most of the typesetting concerned simple fixed symbols +only. Now we turn to variable symbols: symbols that run from one note +to another. In LilyPond terminology, such a symbol is called a +em(spanner). To print a spanner, you have to attach a marker to the +note that begins it and to the one that ends it. + + +The first example of such a symbol is the slur. For the slur, the +start marker is the opening parenthesis. It won't be a surprise that +the stopping marker is the closing parenthesis. +For example: +mudela(fragment,center,verbatim)( c'4( )c'4 ) + +otice that the parentheses should be between the notes.footnote(The +location of the parentheses might be changed in a future version of +the language.) + +It is your job to make sure that each slur that you start also ends. +If it doesn't end, then Bad Things are likely to happen. The slur is +quite flexible: you can nest nop(slurs,)footnote(This is inconsistent when +compared to the syntax for articulation hints. This will probably be +fixed soon.) and you can connect a note with a slur on both the left and the +right side: + +mudela(fragment,verbatim,center)( + c'4(( )c''4 )c'4( )g'4 +) + +Another spanner is the beam (see bind(Figure)ref(mud:beam)). It +indicates the duration of the connected notes, and thus it acts like an +extended version of the flag. Secondly, the pattern of +left/right-pointing beams hints at the metric structure of the +measure. + + +latexcommand(\begin{figure}[h]) + center( + mudela(fragment)([c'8 c'8] [c'16 c'16 c'16 c'16] [c'16. c'32 c'32 c'16.] ) + latexcommand(\caption{Some beams}) + label(mud:beam) + ) +latexcommand(\end{figure}) + + +Strictly speaking, a beam is not a musical concept. The pattern of a +beam can be derived from the structure of the time signature and the durations +of the notes. It is merely a device that helps you understand the +rhythms notated. Unfortunately, LilyPond is not smart enough to insert +beams into your music on her own. You will have to instruct her by +marking the starting and stopping point of the beam with `code([)' and +`code(])' respectively, e.g. + +mudela(fragment,verbatim,center)( + [g'8 g'8] +) + +LilyPond has code that guesses what the pattern should look like, so +that you don't have to specify the beaming for complicated +patterns.footnote(Unfortunately the algorithm used is not foolproof yet: + code([c8. c32 c32]) will produce incorrect results.) + +Again, it is your responsibility to make sure that you end every beam +that you start. + +A third spanner is similar to the slur: the tie. The tie looks like a +slur, but a slur connects whole chords, whereas the tie connects +note heads. Tied notes should be played as one long note. +In analogy with TeX()'s tie (which ties together words with a +space), LilyPond's tie is entered as a tilde, ~. +mudela(verbatim,center,fragment)(c''1 ~ c''4) + +The input convention for the tilde is somewhat peculiar when used in +conjunction with chords. Internally, the extra information that is +represented by the tilde has to be attached to a note (or to a rest, +for that matter). For this reason, you can't put the tilde between +two chords (as in code( <c' g'> ~ <c' g'>)). The tilde sign must be +directly after a note of the chords. It does not matter which +one. The following example demonstrates this: +mudela(fragment,verbatim,center)( + <c'1 ~ g' es''> <c'4 g' es''> +) + +sect(Commands) +label(sec:commands) + +Up till now, we only printed notes, and correspondingly only entered +notes. But notation contains many other constructs, constructs that +help you with reading those notes. Examples of such constructs are +clefs, time signatures, keys etc. + +If you look carefully at the example in +bind(Figure)ref(fig:twinkle1), you will notice that the output +includes some bar lines and clefs, and that there are no references to +those in the input. They were generated automatically. + +Not all such hints can be inserted automatically, and you can also +override some of the settings. This can be done by inserting various +commands between the music. The general form of these commands is +center( + em(keyword) sc(arguments) +) + +em(keyword)s are words that have a special meaning to the parser of +Mudela. Because the parser must be able to distinguish the keywords +from note names, they have to be preceded by a so-called escape +character, the backslash, `code(\)'. To separate the arguments from +any notes that might follow the arguments, you have to end your +command with a semicolon. An added benefit of this construction is +that the commands stand out between your notes, because of the +backslashes. + +So the general form actually is `code(\keyword argument argument ... ;)' +Let us review these commands: + +description( +dit(code(\clef) var(clefname)) This command sets the current clef for notation, + i.e., a clef symbol is printed and the notes following this command + are shifted vertically. The argument is a string, the name of the + new clef. The default clef is the treble clef. + mudela(fragment,verbatim)( + \clef "bass"; c'4 + \clef "treble"; c'4 + \clef "alto"; c'4 + ) +dit(code(\key) var(pitch)) This command changes the current key signature. The + key signature is printed at the start of every line. The argument + is the name of the corresponding major key. The key of C-minor can + thus be specified as `code(\key es)'. + +dit(code(\accidentals) var(pitchlist)) + +This command changes the current key signature. The signature is +given in the form of a list of accidentals, which can be useful for +unconventional keys. The key of C-minor can be specified as +`code(\accidentals bes es as)'. The command `code(\accidentals fis es +bis)' provides a more exotic example. + + +dit(code(\time) var(numerator)code(/)var(denominator)) + This command chages the current time signature. LilyPond uses the + time signature to + calculate where to place the bars that start a measure. These bars + in turn are the places where a system can be broken into lines. + + The default value for this time signature is common time (4/4). You + can also tell this from the Twinkle ``Twinkle Little +Star'' example in bind(Figure)ref(fig:twinkle1). This +song actually has a 2/4 time signature, so a metrically more correct + version would start with as follows: + mudela(fragment,center,verbatim)( + \time 2/4; c'4 c' g' g' + ) + + +dit(code(\cadenza) var(togglevalue)) When typesetting music without a +regular meter (such as an ad libitum cadenza), no bar lines should be +printed. In LilyPond you can achieve this by issuing the command +`code(\cadenza 1)': it turns off the automatically +generated bar lines. + +You switch them on again with `code(\cadenza 0)', and then a bar line +is printed. LilyPond will act as if you are again at the start of a +measure. + +dit(code(\bar) var(bartype)) + This command lets you print special bar lines, such as repeats. You + can also use it to allow line breaks when entering cadenzas. The + argument var(bartype) is a string that describes what kind of bar line to print. + +mudela(fragment,verbatim)( + \bar "|:"; c'4 \bar ":|:"; c'4 \bar ":|"; c'4 \bar "||"; + c'4 \bar "empty"; c'4 \bar "|."; +) + The command `code(\bar "empty")' does not create any visible bar + line, but it does tells LilyPond to allow a linebreak + at that position. + +dit(code(\partial) var(duration)) some music starts with a measure that +isn't fully filled, a so-called upstep. The code(\partial) command +allows you to make +upsteps. The argument is a duration similar to the duration of a note. +Example: + mudela(fragment,verbatim)( + \time 4/4; + \partial 4; + [d'8 dis'] e' c''4 e'8 c''4 + ) + + dit(code(\grouping) var(durationslist)) sets the metric structure of the measure. + Its effect can best be shown by an example: + mudela(fragment,verbatim)( + \time 5/16; + \grouping 16*3 16*2; + [c'8 c'16 c'8] + \grouping 16*2 16*3; + [c'8 c'16 c'8] + \grouping 16*5 ; + [c'8 c'16 c'8] + ) + +In practice, you won't be needing this command very often: the +grouping is switched automatically when you issue a code(\time) +command. It is set to a combination of groups +of 2 and 3 beats, with as many groups of +3 as possible (in other words: 4/4 is divided in two times two beats +(2+2), 8/8 in 3+3+2) +) + +The commands that are described above aren't really music, but they +can be used in the same places as notes. This makes the grammar of the +language simpler. It is possible to put a command into a chord. +For example, the following two snippets of Mudela produce identical output. +verb( + <c4 e g \time 2/4;> + \time 2/4; <c4 e g> +) + + + +sect(Complex music: more than one staff) +label(tutorial:more-staffs) + + +Now we explain how to typeset music that runs in multiple staffs. +Consider the following---somewhat unrealistic---example: + +mudela(fragment)( + \type GrandStaff <e'4 {\clef bass; g4^""} > +) + + The music consists of two notes. Perhaps this is sheet music for a +piano player, and one note is meant to be played with the left hand, +and the other with the right hand. That music would sound the same if +it were written as a single chord on a single staff, i.e., +mudela(fragment)( + <g4 e'4> +) + + +This is another example where we can see that there can be a difference +between a musical idea, and the way it is expressed in notation. + +The Mudela construct for multiple staffs reflects the similarity +between the two examples: to get multiple staffs in Mudela you enter a +chord, with an additional instruction to tell LilyPond that the chord +does not represent notes stacked together, but staffs stacked +together. + +If a piece of music is to be interpreted as a staff, then this can be +expressed with the code(\type) construct. The following input says +``the quarter note with pitch e should be put on a staff.'' + +verb( + \type Staff e'4 +) + +The same can be done for the other note, i.e., + +verb( + \type Staff g4 +) + +If you want to stack these staffs, you must create a chord of both: + +verb( + < \type Staff e'4 + \type Staff g4 + > +) + +This looks reasonable, but the effect of this input is not what you +might expect (try it!). When interpreting this chord LilyPond will +start with the first entry. She'll look for a (nameless) staff. Such a +staff is not found, so it is created. On this staff the code(e) note +is put. When the second code(\type) entry is read, LilyPond will +start looking for a nameless staff. The staff that contains the +code(e) is found, and the code(g) is put there as well. + +The correct solution is to label both code(\type) constructs with +different names, for example code(trebleStaff) and code(bassStaff). +This makes LilyPond distinguish between them, and create two staffs: + +mudela(verbatim,fragment)( + < \type Staff = trebleStaff e'4 + \type Staff = bassStaff g4 + > +) + +The names that you choose do not matter just as long as they are +different. This is almost right, except for the brace at the left and +the clef of the second staff. The bass clef will be taken care of in +the next section. If you want a brace, then you have to tell LilyPond +that the chord you just formed is to be interpreted as a so-called +grand staff. This is also done with the code(\type) command. +mudela(verbatim,fragment)( + \type GrandStaff < + \type Staff = treblestaff e'4 + \type Staff = bassstaff g4 + > +) + +sect(Appending instead of stacking: sequential music) +label(tutorial:voice) + +The previous section dealt with a pretty hypothetical situation: sheet +music with two staffs and each staff containing only one single note. +In real-life situations staffs contain more than one note. They +contain music that has to be played in sequence. A staff can contain +a em(voice). We haven't learned how to make a voice yet: we need a +new construct to express this notion of `voice'. + +The construct is called em(sequential) music. A list of musical +objects (e.g., notes, chords or commands) can be made into sequential +music by enclosing the list in braces; for example: + +mudela(fragment,verbatim,center)( + { c'4 c'4 } +) +mudela(fragment,verbatim,center)( + { <c'4 e'> <e' g'> } +) + + +We could have called this construct more colloquially `voice', but +this would cause confusion later on, when a second kind of voice +enters the scene. Similar confusion might arise from the word +`chord', therefore from now on, we will talk about `simultaneous +music', when we refer to items enclosed in < and >. + + +The notion of a em(new) construct needs some explanation: we have been +using sequential music all the time, except that it was hidden in the +red tape in bind(Section)ref(tutorial:introduction). + + + +If we want to put whole voices onto a staff, then we have to +substitute sequential music for the single notes in the example from +the previous section. A code(\clef) command in the second piece of +sequential +music will also set the clef in +the bass staff. +mudela(fragment,verbatim)( + \type GrandStaff < + \type Staff = treblestaff { e'4 f'} + \type Staff = bassstaff {\clef "bass"; g a } + > +) + +COMMENT(You can nest simultaneous music and chords in any way you want. If +you are interested in the entire story, you should consult +bind(Chapter)ref(chap:features), which has a grammar in +bind(Section)ref(sec:grammar).) + +sect(Notation context) + +This section is about translation contexts, a topic of LilyPond that +is somewhat advanced. You don't have to understand this to use +LilyPond to print simple music. If you don't want to typeset fancy +polyphonic music or tweak the LilyPond notation engine, you can skip +the next two sections. + +In bind(Section)ref(tutorial:more-staffs) it was explained, that there +are more ways to notate a simple chord: as a single voice on a single +staff or in multiple staffs (and we'll soon see, that you can typeset +it as multiple voices on a staff). Obviously the concept of staff is not +really something musical. But what is it then? + + +The most simplistic explanation is: a staff is a peculiarity of the +notation system. In other words, a staff is a graphic device, a +special picture of five lines on which one can print note heads. To +avoid confusion, we will call this view on the concept of staff +`staff symbol' from now on. + + +There is more to it than meets the eye and mind. A staff +contains---besides a staff symbol--- some more components: +itemize( +it()A staff can a have a key signature (printed at the left) +it()A staff has bar lines +it()A staff has a clef (printed at the left) +) +To explain what a staff really is, we'll try to print music without +these components. If these components aren't printed, it is still +possible to print music: +mudela()(\score{ +\melodic \relative c' { \time 2/4; g'4 c,4 a'4 f4 e c d2 } +\paper { + linewidth = -1.; + Staff = \translator { + \type "Line_group_engraver_group"; + + defaultclef = violin; + + \consists "Timing_engraver"; + \consists "Separating_line_group_engraver"; + + \accepts "Voice"; + } + } +}) + +As you can see, one can still make out the general form of the melody +and the rhythm that is to be played, but the notation is difficult to +read and the musical information is not complete. The stress pattern +in the notes can't be deduced from this output. For this, we need a +time signature: + +mudela()( +\score { + \melodic \relative c' { \time 2/4; g'4 c,4 a'4 f4 e c d2 } + \paper{ + linewidth = -1.; + Staff = \translator { + \type "Line_group_engraver_group"; + defaultclef = violin; + \consists "Time_signature_engraver"; + \consists "Separating_line_group_engraver"; + \accepts "Voice"; + } + } +}) + +Technically speaking you know where the strong and weak beats are, but +it is difficult to find them quickly. Bar lines help you in finding +the location within the measure of the notes: +mudela()( +\score { + \melodic \relative c' { \time 2/4; g'4 c,4 a'4 f4 e c d2 } + \paper{ + linewidth = -1.; + Staff = \translator { + \type "Line_group_engraver_group"; + defaultclef = violin; + \consists "Bar_engraver"; + \consists "Time_signature_engraver"; + \consists "Separating_line_group_engraver"; + \accepts "Voice"; + } + } +}) + +We can remedy part of the difficulties with reading pitches by adding a staff +symbol: + +mudela()(\score{ + \melodic\relative c' { \time 2/4; g'4 c,4 +a'4 f4 e c d2 } \paper { + linewidth = -1.; + Staff = \translator { + \type "Line_group_engraver_group"; + + defaultclef = violin; + \consists "Bar_engraver"; + \consists "Time_signature_engraver"; + \consists "Staff_sym_engraver"; + \consists "Separating_line_group_engraver"; + + \accepts "Voice"; + } + } +}) + +This makes the output decidedly easier to read, but you still don't +know what the pitches of the notes above are. So this is still not +enough. But suppose you see the following notation: +mudela()(\score { + \melodic \relative c' {\clef alto; \time 2/4; g'4 c,4 a'4 f4 e c d2 } +\paper { + linewidth = -1.; + Staff = \translator { + \type "Line_group_engraver_group"; + + defaultclef = violin; + \consists "Bar_engraver"; + \consists "Time_signature_engraver"; + \consists "Clef_engraver"; + \consists "Staff_sym_engraver"; + \consists "Timing_engraver"; + \consists "Separating_line_group_engraver"; + + \accepts "Voice"; + } + } +}) + +Now you know the pitch of the notes: you look at the start of the line +and see a clef, with this clef, you can determine the notated pitches. +You have found the em(context) in which the notation is to be +interpreted! + +So the context determines the relationship between a piece of music +and its notation: you, the reader, use context to deduce music from +notation. Because LilyPond is a notation ``writer'' instead of a +reader, context works the other way around for Lily: with context a +piece of music can be converted to notation. +The components of a staff form context, and context is needed to read +and write notation. This motivates the following definition. + +quote( +A bf(notation context) is a conversion from music to notation. +) + +The example focused mainly on on staffs, but a staff is not the only +type of notation context. Notation contexts may be nested: you can +print polyphonic music by putting multiple `Voice' contexts in one +`Staff' context. The arguments of the code(\type) command (Staff, +GrandStaff) were in fact all names of different contexts. +The notions of ``current clef'' and ``current position within the +measure'' are all properties of notation contexts. Commands like +code(\clef) and code(\cadenza) change these properties. + + +The following is a list of the contexts that are supported by +LilyPond: +description( + +dit(Voice) The code(Voice) context is a context that corresponds to a + voice on a staff. This context handles the conversion of noteheads, + dynamic signs, stems, beams, super- and subscripts, slurs, ties and rests + +dit(Staff) The code(Staff) context handles clefs, bar lines, keys, + accidentals. A code(Staff) context can contain multiple code(Voice) + contexts. + +dit(RhythmicStaff) The code(RhythmicStaff) context is like the staff, + but much simpler: the notes are printed on one line, and pitches are + ignored. code(RhythmicStaff) can contain code(Voice) contexts. + +dit(GrandStaff) A code(GrandStaff) context contains code(Staff) + contexts, and it adds a brace to the output at the + nop(left.)footnote(This is a major deficiency in the current + implementation. Currently stems, + slurs and beams cannot be printed across two staffs. +In reality, a grand staff is a hybrid of one big staff and two stacked staffs.) + + A code(GrandStaff) context can contain multiple + code(Staff)s. Typically, it will contain two code(Staff)s, one + treble staff, and one bass staff. The bar lines of the contained + staffs are connected vertically. + +dit(StaffGroup) A code(StaffGroup) context contains code(Staff) or + code(Lyrics) contexts, and prints a bracket at the left. The bar + lines in the participating staffs are connected. + +dit(Lyrics) As its name suggests, The code(Lyrics) context deals with + typesetting lyrics. This topic will be covered in + bind(Section)ref(tutorial:lyrics). + +dit(Score) The code(Score) context is the toplevel context: no context can + contain a code(Score) context. The code(Score) 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. + + The code(Score) can contain code(Staff), code(StaffGroup), code(Lyrics), code(GrandStaff) and + code(RhythmicStaff) contexts. + +COMMENT(do ChoireStaff) +) + + + Later on, in bind(Section)ref(tutorial:engravers) we will +explain how you can create your own contexts. + +If you are familiar with structured documents (like HTML, SGML or +LaTeX()), you might see the analogy of a context with a stylesheet: a +stylesheet is neither presentation nor information, but rather a +recipe em(how) a specific piece of information should be presented. +Analogously, a notation context is neither music nor notation, but the +conversion between the two. The big difference with text is that in +music notation the elements provided by context are essential to +understanding what is notated. + + + +sect(Polyphonic music (or: Notation context properties)) + +In the last section we explained that a notation context can have +properties that influence the conversion from music to notation. A +simple example of such a property is the clef: the type of clef partially +determines the vertical position of note heads in a staff. Some of +these properties can be modified by commands such as code(\clef) and +code(\time). But there is more: notation contexts also have +properties are settable in a generic fashion. We will demonstrate +this feature by printing multiple voices on a staff. + +In polyphonic (keyboard) music and orchestral scores often more than +one voice is printed on one staff. We'll explain how to achieve this +effect with LilyPond. The effect is not unlike the two stacked staffs +from bind(Section)ref(tutorial:more-staffs), except that we don't want +to stack staffs but voices. Thus, the general template is the following: +verb( + \type Staff < + \type Voice = one ... + \type Voice = two ... + > +) + +On the ellipsis there should be music going from left to right, in +otherr words, there should be sequential music, notes enclosed in +braces. Let us try the following simple melodies: + +mudela(fragment,verbatim)( +\type "Staff" < + \type "Voice" = "one" { r4 as'4 () as'4 g'4 } + \type "Voice" = "two" { g'2 f'4 e'4 } +>) + +As you can see the result is not quite perfect. The notes on the last +two beats look like plain chords and not like separate voices. What +really happened was that the stems of the upper and lower voices were +printed on top of each other. If you have tried running this example, you will probably +have noticed a complaint about ``too many +clashing notecolumns'' during the LilyPond run. +This complaint refers to the overlapping stems. + +To remedy this, engravers traditionally make the stems of the upper +and lower voice point in different directions: the stems of the lower +voice point down, and the stems of the upper up, as shown in +bind(Figure)ref(tutorial:multi-voice-fig). + +Surely the direction of a single stem is a property of the stem as a +graphical object. But the fact that all of the stems in a voice point +in the same direction is not directly graphical. Since this is a +property shared by all the stems in the voice, it is logical to +consider this property to be a property of the context code(Voice). +And this is how it's done in LilyPond: the context code(Voice) has an +attribute whose value is the direction to use +for stems. You can change it to `up' +by issuing the following phrase:footnote(The name code(ydirection) is +no mistake. The property also controls the up/down directions of +super-/subscripts, slurs, ties, etc.) + +verb( + \property "Voice"."ydirection" = "1" +) + +This command should be read as ``change the property called +code(ydirection) within the current code(Voice) context to the value +code(-1).'' For the property code(ydirection) the value code(1) means +`up', and code(-1) means `down'. The proper way to code the +polyphonic example is given in bind(Figure)ref(tutorial:multi-voice-fig). + +latexcommand(\begin{figure}[h]) +mudela(fragment,verbatim,center)( + \type "Staff" < + \type "Voice" = "one" { + \property Voice.ydirection = "1" + r4 as'4 () as'4 g'4 } + \type "Voice" = "two" { + \property Voice.ydirection = "-1" + g'2 f'4 e'4 } + > +) + latexcommand(\caption{multiple voices}) + label(tutorial:multi-voice-fig) +latexcommand(\end{figure}) + +Other properties can also be set, and they can be within different +contexts. In general, you can set a property by specifying +code(\property) var(contexttype)code(.)var(propertyname) code(=) +var(value). Both var(ContextType), var(PropertyName) and var(Value) +should be strings. + +The effect of a property is pretty much hardwired into the +implementation (and thus subject to change), so we will not deal with +all the possible properties in detail. Among other characteristics that +can be set are the layout of slurs and beams. The initialisation file +file(property.ly) explains most properties. + +We conclude this section with another example of a context property. +Polyphonic music that has three or four voices can't be printed by +simply changing the directions of the stems for each voice, obviously. +Traditionally, some chords are shifted horizontally to print if this many +voices have to be printed. +LilyPond can also do this, and the property that controls the +horizontal shifting is called code(hshift). The notes in a +code(Voice) context that has code(hshift) set to a true value (i.e., +non-zero or non-empty), will be shifted horizontally in the case of a +collision. The following example demonstrates the effect. + +mudela(fragment,verbatim)( + \type "Staff" < + \type "Voice" = "one" { + \property Voice.ydirection = "1" + r4 as'4 () as'4 g'4 } + \type "Voice" = "two" { + \property Voice.ydirection = "1" + \property Voice.hshift = 1 + g'2 f'4 e'4 } + \type "Voice" = "three" { + \property Voice.ydirection = "-1" + [d'8 dis'] [d' cis'] [c' b] c'4 + } + > +) + +sect(Lyrics) +label(tutorial:lyrics) + +Now for something completely different: Lyrics. Lyrics are also +considered to be music, although a lyric by itself does not have any +pitch. Producing lyrics has two aspects. First, you have to enter the +text, i.e., the syllables along with their durations. +After this, you have to specify how to convert these to graphics. + +Lyrics consist of syllables, which are strings together with +durations. Previously we only entered note names, so for entering +lyrics we have to instruct LilyPond that what we enter are not note +names but words---or rather: strings. This instruction is the keyword +code(\lyric). After entering this keyword you can enter a musical +construct---sequential music, simultaneous music, code(\type) +entries, etc.--- but with syllables in stead of pitches. For example: +verb( \lyric { 'got8 me on my knees4, Le-8 lie! }) + +The effect of code(\lyric) can be compared with the effect of the +doublequote character, code("), for it also changes the lexical +meaning of spaces and characters. This mode is another example of a +handy input feature of the language. + +Next comes the conversion to notation. LilyPond can't (yet) figure +out that lyrics need different treatment than notes. As a result, the +default conversion will try to put the text you entered as note heads +onto a staff, and this will fail. This default must be overriden with +a code(\type) keyword. Printing syllables of text in a line is done +by a context called code(Lyrics). You can select this context with +the code(\type) keyword. Here is a simple example: + +mudela(fragment,verbatim)( + \type Lyrics \lyric { 'got8 me on my knees,4 Le-8 lie! }) + +The result is technically more or less correct, but without a melody it +just doesn't work, so let's add a blob of cream: +mudela(fragment,verbatim)( + < + \type Staff { c''8. c''16 bes'8. a'16 g'4 f'8 g'4. } + \type Lyrics \lyric { 'got8. me16 on8. my16 knees,4 Le-8 lie!4. } + > +) + +The strings that makes up each syllable in the lyrics block are passed +along to TeX() verbatim, so if you are proficient with TeX() you can +do various nifty things. Just keep in mind that a syllable either +starts with a letter (a character in the range `code(a)' to `code(z)' +or `code(A)' to `code(Z)'), or it is a string enclosed quotes. It ends +with either a number for the duration, or a space. A last feature +that should be mentioned is the space-lyric: if you want to enter +a single ``syllable'' that consists of multiple words, i.e., words +separated by spaces, you should use an +underscore instead of a space. All these tricks are demonstrated in +the following example: + +COMMENT( urg +\type Lyrics \lyric { 'got_m\textbf{e}4 on8. m$\cal_Y$16 knees,4 Le-8 lie!4.} +\type Lyrics \lyric { 'got_m{\bf e}4 on8. m$\cal_Y$16 knees,4 Le-8 lie!4.} +) + +mudela(fragment,verbatim)(< + \type Staff { c''8. c''16 bes'8. a'16 g'4 f'8 g'4. } + \type Lyrics \lyric { 'got_me4 on8. m$\cal_Y$16 "3s,"4 Le-8 lie!4.} +> +) + +The spacing in the above example is a bit skewed because Lily can't +tell that the long syllables you entered are not ordinary characters, +but expand to really small symbols. + + + + +COMMENT(Rood is de kleur van geluk.) +COMMENT(Dat geldt ook voor haar.) + + +sect(Toplevel Mudela) + +Now the time has come to unravel the red tape that we have hidden from +you in the introduction. Mudela has a hierarchical structure for we +have seen that sequential and simultaneous music can be nested. +Mudela also has other `blocks' that can be nested. The general syntax +for a block is code(\keyword { ... }). + +When you run LilyPond, what happens is that you define music, and +specify one (or more) conversions to apply to that music, for example +a conversion to notation. This is done by putting the definition of +the music and the definition of the conversion together in a +code(\score) block, e.g., +verb( +\score { + % ... music ... + \paper {} +}) + +This is almost the context that should be around all +of the previous examples. The precise context reads thus: +verb( +\score { + \melodic { ... } + \paper {} +}) +On the ellipsis, you entered what shown as the example input. +You can see that in the +above example, the code(\melodic { ... }) forms the music, the +code(\paper {}) is a conversion to paper (notation, that is). The +code(\paper) definition is copied from a default definition +(which is in the initialisation file file(paper16.ly)). +The paper part also contains +the definition of the contexts. + +The keyword code(\melodic) is analogous to the code(\lyric) keyword. It +will switch the tokenizer into a mode that interprets plain words as +note names. If it can't recognize the words as a note name, it will +assume that they are strings. That is the reason why you can write +code(\clef bass) in stead of code(\clef "bass"); most of the strings +in code(\melodic) mode can be written without quotes. + +The braces that you see after the code(\melodic) keyword are the +braces that are around sequential music. Because of these braces, the +sequences of notes in our simple examples were sequential (and not +simultaneous). As a result the notes were printed from left to right, +and not stacked. + +sect(Identifiers) + + +Now that we are comfortable with the toplevel entries in a mudela +file, we can investigate some more of the recreations on toplevel, in +particular em(identifiers). Generally you can define an identifier by +entering code(identifierName = ... ) +where there can be a variety of things on the ellipsis. + +Here is a (partial) list of what you can abbreviate with identifiers +at top-level. +itemize( +it()The code(\score) block +it()The code(\paper) block +it()The code(\midi) block (to be explained in + bind(Section)ref(tutorial:sound)) +it()Music (sequential music, simultaneous music etc.) +it()Durations +it()Strings +it()Translators (to be explained in bind(Section)ref(tutorial:engravers)) +it()Integers +it()Reals +) + +When you refer +to the abbreviated entity, you must precede code(identifierName) +with a backslash, i.e., code(\identifierName). For example: +mudela(verbatim)( + czerny = \melodic { [c16 g e g] } + \score { + \melodic \type GrandStaff < + { c''2 g''2 } + { \clef bass; \czerny \czerny \czerny \czerny} + > + \paper { + linewidth = -1.0; + stem_length = 12.0*\internote; + } + } +) + + + +Another interesting feature of this example are the assignments within +the paper block. Some blocks, such as code(\paper), have a scope of +their own. In the case of the code(\paper) block, these variables +influence the characteristics of the output. As is shown, you can +tune quantities like the stemlength, and enter simple expressions. +The purpose of the negative linewidth is to prevent the music from +being justified. The identifiers that are meaningful are for the +paper block is strongly implementation dependent, so they will not be +listed here. Moreover, since most of the values are predefined to +sensible defaults, there usually is no need to tune these values. + +Recall the properties of a context, that could be set with +code(\property). It is a very general mechanism to tune the output of +the music, that is neatly separated from the real music. +Unfortunately, it is not convenient to type or read, and the precise +effect of a setting property isn't always apparent from its +definition. To remedy this, we can use an identifier to capture the +meaning of a code(\property). + +mudela(verbatim)( +stemup = \property Voice.ydirection = "1" +stemdown = \property Voice.ydirection = "-1" +shift = \property Voice.hshift = "1" +\score { + \type "Staff" \melodic < + \type "Voice" = "one" { + \stemup + r4 as'4 () as'4 g'4 } + \type "Voice" = "two" { + \stemup + \shift + g'2 f'4 e'4 } + \type "Voice" = "three" { + \stemdown + [d'8 dis'] [d' cis'] [c' b] c'4 + } + > + \paper{ linewidth = -1.0\pt; } +} +) + +Several abbreviations like code(\stemup) are defined in the +standard initialisation file file(property.ly). Setting or changing +context properties can have a similar effect as the commands that were +discussed in bind(Section)ref(sec:commands). Don't be fooled by the +similarity in appearance between a declared property-setting entry +and a real command. Real commands are hardcoded into the language +and they have to be terminated by semicolons. + +You can also use identifiers to break up the heavy nesting that can occur +in the code(\score) block. Another useful application is +parametrisation of the music: if you use identifiers in the +code(\score) block, you can make variations of the music by simply +redefining those identifiers. One particular application of this is +part extraction: by using identifiers and redefining them, one can +print extracted parts and a full orchestral score from the same +music definition. + + + +sect(Sound output) +label(tutorial:sound) + +You get output by combining music with definition a conversion to +output. Up till now we have only focused on the graphic output of +traditional engraving. But there is no reason why that should be the +only form of output for music. LilyPond currently supports one other +conversion: the conversion from abstract music to sound. You can have +LilyPond play the music that you entered. The format that is used +for this output is MIDI. + +The only information that you need to enter is the + nop(tempo)footnote(Unfortunately, +this the only thing that can be tuned at this +time. This is a limitation: the tempo of music can vary throughout +the music.) for the performance. The syntax for the tempo is +code(\tempo )var(duration) = var(beatsperminute);), for example: +verb( +\score { + ...music... + \midi { \tempo 4 = 76; } +} +) + +The most useful purpose of this sound output is to prooflisten your +files: typing errors (especially if they involve accidentals) stand +out when you listen. +The output was implemented in a very rudimentary manner, so it is +probably not worth listening to for any other reason. + + +sect(Contexts revisited: engravers) +label(tutorial:engravers) + +As was promised, we will now take a dive into the more wizardrous parts +of LilyPond: redefining (notation) contexts. We previously explained +that a context +itemize( +it()is a conversion from music to notation, +it()can contain other contexts +it()handles specific notation constructs +) + +This characterization almost automatically explains what the definition of a +context should look like: +itemize( +it()It should be part of the ``notation output definition,'' i.e., the + code(\paper) block +it() + It should contain a specification of what other contexts may be contained + in the context we're defining. +it() + It should contain a list of the notation constructs to be + handled. +) + +In practice, the context definition +looks like this: +verb( +\translator +{ + \type "Engraver_group_engraver"; + \accepts "..."; + \accepts "..."; + \accepts "..."; + + \consists " ... "; + \consists " ... "; + \consists " ... "; + + propertyname = "value"; + propertyname = "value"; + +} ) + + This is encoded by the + +The code(\translator) keyword opens the block for translation (or +context) definition. The code(\type) keyword explains to Lily that +the context should be formed by taking an (empty) instance of +code(Engraver_group_engraver). The code(Engraver_group_engraver) is a +C++ class from the source code to Lily. The code(\accepts) entries +explain what kind of contexts this context could contain. If we were +to define a context for a staff, the definition would typically +contain code(\accepts "Voice";). + +The code(\consists) entries specify which notation constructs should +be handled. This needs a little explanation: LilyPond contains the +code for quite a large number of basic building blocks for notation +generation, and each building block handles only one notation +construct. The name of such a building block is `engraver'. You can +specify which notation construct a context should handle by specifying +which engravers should be part of the context. The code(\consists +"Foobar") entry really means ``add an instance of code(Foobar) to the +translation group.'' + + +For example if this context should print time signatures, the definition +should include `code(\consists "Time_signature_engraver";)'. Again +code(Time_signature_engraver) is a class from the source code of LilyPond. + + + +Finally, one can pre-set some properties in a context definition. + +As a practical example, we will show you how to typeset polymetric +music, i.e., music where the meter can differ for each staff. The +solution is not very complicated: normally all timing information +(time signature, rhythmic grouping) is synchronised across each staff. In +LilyPond this is expressed by having only one registration for timing +information for all staffs. To be precise, there is only one +code(Timing_engraver), and it is located in the top level context, the +code(Score) context. + +All staffs use the information in the global code(Timing_engraver) +for generating bar lines and time signatures. In polymetric music, this timing +information can be different for every staff, so we should redefine +the code(Staff) context to include and the code(Score) context to exclude the +code(Timing_engraver). + +mudela(verbatim)( +polymetricpaper = \paper { + Score = \translator { + \type Score_engraver; + \consists "Score_priority_engraver"; + \consists "Priority_horizontal_align_engraver"; + \consists "Vertical_align_engraver"; + % \consists "Timing_engraver"; % removed Timing_engraver + \accepts "Staff"; + } + + Staff = \translator { + \type "Line_group_engraver_group"; + + defaultclef = violin; + + \consists "Bar_engraver"; + \consists "Clef_engraver"; + \consists "Key_engraver"; + \consists "Local_key_engraver"; + \consists "Time_signature_engraver"; + \consists "Timing_engraver"; % added Timing_engraver + \consists "Staff_sym_engraver"; + \consists "Separating_line_group_engraver"; + + \accepts "Voice"; + } +} +\score { + \melodic < + \type Staff = one { \time 2/4; c'4 c'4 c'4 c'4 c'4 c'4 } + \type Staff = two { \time 3/4; c'4 c'4 c'4 c'4 c'4 c'4 } + > + \paper { \polymetricpaper + linewidth = -1.; + } +} +) + +As you can see, we used the identifier code(polymetricpaper) to break +up the large score block. More of these context definitions appear in +the standard initialisation file file(engraver.ly). + +sect(Urtexts and context selection) +label(tutorial:urtext) + +In bind(Section)ref(tutorial:more-staffs), we have shown you how to make +multiple staffs, and explained that you have to label every staff (or +more precisely: different contexts), to make sure that new ones are +created when you need them. In this section, the real power of this +mechanism will unveiled. + +By naming other contexts that you create, you can reference other contexts +than the current context from within the music. For example, from within the music that you +enter for staff code(One), one could enter a small piece of music, +and send it to staff code(Two), e.g., +mudela(fragment,verbatim)( + < + \type Staff = one { c''4 \type Staff = two { c4 c4 } c''4 } + \type Staff = two { \clef bass; g,4 g,4 g,4 g,4 } + > +) + + +Another useful application of this feature is making Urtexts. +em(Urtext) is the German word for `original text'. The Urtext +edition of a piece of music, is an edition that reflects the original +writing of the composer. Such editions are useful for musicologists, +and performers that want to perform authentic interpretations. However, +for mere mortals, the Urtext can be quite hard to read. It might not +contain fingering and beaming, and typically it is full of footnotes. +Moreover, common interpretations may have emerged---after the composer +died. For this reason, the music that can be had as Urtext usually is also +available in enhanced and edited editions. + +The mechanism of context selection can be used to fabricate an Urtext +and an edited edition from em(one source). We will use the first few +bars of bind(J.)bind(S.)Bach's lovely Cello suite bind(no.)I to +demonstrate this. The example makes heavy use of space rests: a space +rest is a like a rest that doesn't print anything. It can be used as +a placeholder, to attach articulation marks to. It is entered as a +note with the name code(s). + +mudela(verbatim)( + bach = \melodic { [c16 g e' d'] [e' g e' g] } + + staffStuff = \melodic { \clef bass; \time 4/4; s1 \bar "|."; } + + slursOne = \melodic { s16( s s s s16 s s )s } + slursTwo = \melodic { s16-. s s() s s16() s s ()s } + + \score{ + { < \type Voice = celloVoice { \bach \bach } + \type Voice = celloVoice { \slursOne \slursOne } + \staffStuff + > + < + \type Voice = celloVoice { \bach \bach } + \type Voice = celloVoice { \slursTwo \slursTwo } + \staffStuff + > + } + \paper {} + } +) + + The slurs that you define should be put on the music that is defined +by the code(\bach) identifier. By labeling a code(Voice) context, and +directing both the articulation and the notes to that same code(Voice) +context, the articulation is put over the right notes. + + +sect(Transposing) +label(tutorial:more-grammar) + +COMMENT(In this section, we will complete the grammar for Music that was +sketched earlier. ) +One of the things that you can do with music is +em(transposing) it. If you want to transpose a piece of music, then +you should prefix the keyword code(\transpose) along with the pitch +(relative to the central C) for the transposition.footnote(the +code(\type Staff) is to make sure that no separate staffs are created +for the code(\scale) and code(\transpose cis' \scale) part.) + + +mudela(verbatim)( +scale = \melodic \relative c' { [c8 d e f] } +\score { + \melodic { + \type Staff { \scale \transpose cis' \scale } + } + \paper { linewidth = -1.0; } +}) + + +sect(Staff switching) + +We have seen that contexts can be nested. This means that they form a +tree. It is possible to edit this tree: for example, a code(Voice) +context can be taken out of a code(Staff) context, and put into +another. This has the effect of the voice switching staffs (something +that often happens in keyboard music). The syntax for this operation +with these particular contexts is code(\translator Staff = newStaffName). + +The effect is analogous to the first example in section +ref(tutorial:urtext), but with the code(\translator) construction it +is possible to split the real music and the commands that determine in +which staff the music is printed. For example: + +mudela(verbatim)( + +% real music +aVoice = \type Voice = voiceA \melodic { c''4 c4 c4 c''4 } +bVoice = \type Voice = voiceB \melodic { g,4 g,4 g,4 g,4 } + +% staff switching stuff +switch = \type Voice = voiceA \melodic { s4 \translator Staff = staffB s4 + s4 \translator Staff = staffA s4 } + +\score { + < + \type Staff = staffA < \aVoice \switch > + \type Staff = staffB < \bVoice \clef bass; > + > + \paper { linewidth = -1.; } +} +) + +Don't try to switch staffs when you are in the middle of a slur or +beam, though. It doesn't work yet. + +sect(Hairy durations: triplets) + +In the previous section we explained an operation that changes the +pitches of music, transposition. In this section we will explain an +operation that modifies the duration of the notes that you enter. +When notes are part of a triplet, then the real of duration of the +notes are 2/3 part of what their shape indicates: +mudela(fragment)( +\[/3 c'4 c'4 c'4 \]/1 +) + +To support this notion, Mudela allows you to modify the duration of a +note by multiplication or division. A code(c'4) note that would be in a +triplet is written as code(c'4*2/3). If you sequence a few of these +notes, you get a triplet.footnote(We added a normal staff in the example to +show the difference.) +mudela(fragment,verbatim)( +< \type Staff = staffA { c'8*2/3 c'8*2/3 c'8*2/3 c'4} + \type Staff = staffB { c''8 c''8 c''4 } >) + +LilyPond knows that these notes are no normal eighth notes, but the +reader doesn't yet. To help the reader a beam or a bracket with a `3' +should be printed. The special beam command `code([2/3)' and the +matching close beam `code(]1/1)' will take care of that, and +they also abbreviate the code(*2/3) part. If you want brackets in +stead of beams, you can use `code(\[2/3])' and `code(\]1/1)'. +mudela(fragment,verbatim)( +< \type Staff = staffA { + [2/3 c'8 c'8 c'8 ]1/1 + \[2/3 c'8 c'8 c'8 \]1/1 + } + \type Staff = staffB { [c''8 c''8 c''8 c''8] } +>) + +Other tuplets can be entered in the same way. +mudela(fragment,verbatim)( +< \type Staff = staffA { + \time 7/8; + [7/6 c'8 c'8 c'8 c'8 c'8 c'8 ]1/1 + } + \type Staff = staffB { + \time 7/8; + [c''8 c''8 c''8 c''8 c''8 c''8 c''8] } > +) + +For your convenience, code([2/3) can be further abbreviated to code([/3), and +you can abbreviate code(]1/1) on the closing beam marker to code(]/1). + +mudela(fragment,verbatim)( +< \type Staff = staffA { + [/3 c'8 c'8 c'8 ]/1 c'4 + } + \type Staff = staffB { [c''8 c''8] c''4 } > +) + + +bf(Important) the construct with code([/3) and +code([/1) is a hack that sets a mode in the parser. This means that +verb(id = \melodic { c8 c8 c8 } +notATriplet =\melodic { [2/3 \id ]1/1 }) +does not produce a triplet. It will hopefully +soon be replaced by a construction that mixes more elegantly with the +grammar for Music. + + +sect(Shortcuts for octaves) +label(sec:relativeoctaves) + +Plain Mudela contains a lot of quotes to get the octaves right. This +need for quotes can be reduced: most of the pitch intervals in +conventional music are small. Therefore, it makes sense to leave out +the quotes when the interval is small. We have built a mode that does +exactly this. It is called the relative mode for octaves. You can +switch it on by entering code(\relative). Then LilyPond will +interpret every note as if they mean the note with the same name +closest to the previous. You have to specify the first pitch because +the first note of a list obviously has no predecessor. So, you can +enter a scale without using octavation quotes, e.g., + +mudela(fragment,verbatim)( + \relative c' { c d e f g a b c } +) + +For chords, the relative mode works slightly differently. In a +sequence of chords, the first note of a chord gives the starting point +for the next chord. We can demonstrate this with our twinkle twinkle example +verb( + \relative c' { + c4 c <c g'> <c e g> + <c e a> <b d a'> <b2 d g> + <a4 d f> <bes d f> <bes c e> <g c e> + <e a d> <a, g' cis'> <d2 f d'> + } +) + +LilyPond converts any music with code(\relative) prepended to absolute +music immediately when it is read. Internally it is stored it in +absolute pitches. Since the tutorial mainly deals with how to specify +musical information, and not how to enter it conveniently, the +tutorial doesn't use it. + + +sect(Large pieces) +label(tutorial:large-pieces) + +In our quest for a clean and powerfull music language, we took the effort +of entering some larger pieces of music as well. From this we learned +certain things that lead to direct improvements of Mudela, such as the +relative mode. We also gained some practial experience, that resulted in a +compilation of tips that may be of use to you. + +Entering a large piece of music will often imply the need to produce a +conductor's score, as well as individual parts for all instruments. This +can most easily be achieved making use of identifiers and including mudela +files. + +subsect(Identifiers) + +Briefly introduced before, identifiers are your biggest help in structurising +a large piece of music. As an example, we'll consider a string quartet. +In short, it will look like this: verb( + global = \melodic{ } + violinoOne = \melodic \relative c { .. } + violinoTwo = \melodic \relative c { .. } + viola = \melodic \relative c { .. } + violoncello = \melodic \relative c { .. } +) + +The code(\global) part contains everything that is global, i.e., the +same, for each instrument. This may include time signature, key, repeat +signs, different bar types, time signature- and key changes, rehearsal +marks, etc. + +For each instrument, you'll have something vaguely resembling verb( + violinoOneStaff = \type Staff = violinoOne < + \property Staff.midi_instrument = "violin" + \property Staff.instrument = "Violino I" + \property Staff.instr = "Vl. I" + \global + \violinoOne + > +) + + +[Versions, relative mode, + barchecks, splitting of files] + +subsect(Including Mudela files) +ref(subsect:include) + +You can include other Mudela files with the command code(\include): +verb( +\include "paper13.ly" +\score { + ... + \paper { \paper_thirteen } +}) + +The file is looked for in the standard search path. + + +subsect(Grouping of staffs) + +subsect(Versioning) + +sect(Titling) +label(tutorial:titling) + +A piece of sheet music isn't complete without proper opening and +closing titles. LilyPond does not have any real support for setting +text: that is a job best left to TeX(). But you can pass messages to +TeX() from the input file. You can write TeX() macros to handle +these messages. +To do this, you add a code(\header) block +to your input file. The format is quite simple, + +verb( +\header{ + "key" = "value"; + "key" = "value"; + "key" = "value"; + % etc. +}) + +When the results of the music typesetting are output, the contents of +code(\header) are also up into the TeX() file. Tools like +code(ly2dvi) can use this information to generate pretty titling for +your input file. Consult the manual page of code(ly2dvi) for more +details. + + +The code(\header) block should be at toplevel in mudela, and +preferably at the top of the file. If you have an input file with +multiple code(\score) blocks, you should add a header to every score, +describing the different sub parts of the music piece, eg. + + +verb(\header { + "composer" = "Ludwig Van Bavaria"; + "title" = "Symphonie Megalomane"; + } + \score{ + ... % some music + \header { movement = "Mit roher Kraft wild herausfahrend!"; } + \paper { } + } + \score{ + ... % some more music + \header { movement = "Saut\'e comme un oeuf."; } + \paper { } + } +) + +If you want you can also put the code(\header) block at the top of the +input file; it will then be put into every output file automatically. +This will make it clear what the file contains as soon as you open it. + + + diff --git a/NEWS b/NEWS index 664e3e0c7b..a4d321946f 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,15 @@ +pl 2 + - bf mudela-book.py + - scalar compile stuff + - bf install directory + - YODL note + - GUI faq update + - bf ly2dvi + - stepmake split: Po.make + - make check target + - dist AFMs and manpages + - split up mudela.yo in glossary.yo, tutorial.yo and refman.yo + pl 1.jcn2 - renamed -alto -> viola - bf: avant-gardish six preludes @@ -8,6 +20,14 @@ pl 1.jcn1 - fake msgfmt - make uninstall fixes +pl 1.jbr2 - aclocal.m4,stepmake/aclocal.m4,stepmake/stepmake/Variables.make: + Support install target for unix, unix cross compile, and + Windows NT + +pl 1.jbr1 - stepmake/stepmake/Executable.make: DOTEXE was missplaced + - scripts/convert-mudela.py: program_id should write to stderr + +************** pl 1 - mi2mu fix: \key "D" - \hoffset diff --git a/README.txt b/README.txt index 2008fc4f8c..daeee83662 100644 --- a/README.txt +++ b/README.txt @@ -31,8 +31,8 @@ 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 configure (--enable-tex-dir, ---enable-mf-dir) +to specify directories for TeX to configure: this is done with +the options --enable-tex-dir and --enable-mf-dir 4: DOCUMENTATION @@ -45,9 +45,7 @@ and then do this: You can also simply read the .yo sources. They are ASCII text. The complete documentation is accessible in formatted form at the -website - - http://www.cs.uu.nl/people/hanwen/lilypond/index.html +website http://www.cs.uu.nl/people/hanwen/lilypond/index.html 5: COMMENTS @@ -63,8 +61,7 @@ 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://pcnov095.win.tue.nl/pub/lilypond/ (Europe) +ftp://pcnov095.win.tue.nl/pub/lilypond/ If you decide to build LilyPond from source, please read the INSTALL.txt document first, especially the Windows NT/95 section. @@ -76,8 +73,7 @@ Linux-Intel unix users. * If you have installed a previous version, be sure to remove old font files, eg - - rm `find /var/lib/texmf/fonts -name 'feta*'` +rm `find /var/lib/texmf/fonts -name 'feta*'` a script to do this for you is in bin/cleanfonts.sh diff --git a/TODO b/TODO index 893aa58eac..8a13a3860b 100644 --- a/TODO +++ b/TODO @@ -6,12 +6,24 @@ done, or is an idea that I want to think about Most of the items are marked in the code as well, with full explanation. grep for TODO and ugh/ugr/urg - * fix plain tex footer line. - * portable libs for flowerlib/lilylib + * fix plain tex footer line. - * install TeX stuff into tex/generic directory. + * portable libs for flowerlib/lilylib + * install TeX stuff into tex/generic directory. + + * preformatted .info stuff. + + * percussion note heads + + * mi2mu empty staffs. + + * include MIDI list + + * make separate translation property list. + + * key undo. * make GNU style webpages. @@ -21,13 +33,6 @@ grep for TODO and ugh/ugr/urg the form feta*.ly. In particular init.ly doesn't get installed. I installed the files by hand and then the system seems to work. - * I things it's more than appropriate for an GNU project to ship Info - files (and manpages) with the source package. The "Standard" tells to - do so (ftp://ftp.gnu.org/pub/gnu/standards/standards.text): - - - * a `make check' target (without installing stuff!) - * midi_instrument -> midiInstrument * horizontal centering of dynamics diff --git a/VERSION b/VERSION index b79339f1e0..36dc14b269 100644 --- a/VERSION +++ b/VERSION @@ -1,8 +1,8 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=0 -PATCH_LEVEL=1 -MY_PATCH_LEVEL=jcn2 +PATCH_LEVEL=2 +MY_PATCH_LEVEL= # use the above to send patches, always empty for released version: # please don't move these comments up; the patch should fail if diff --git a/aclocal.m4 b/aclocal.m4 index 5f282f05b1..dbcb4d30d2 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -234,13 +234,16 @@ dnl fi LN=cp # hard link does not work under cygnus-nt (yet?) ZIP="zip -r -9" # DOTEXE=.exe + INSTALL="\$(stepdir)/../bin/install-dot-exe.sh -c" else LN=ln ZIP="zip -r -9" + INSTALL="\$(stepdir)/../bin/install-sh -c" fi AC_SUBST(DOTEXE) AC_SUBST(ZIP) AC_SUBST(LN) + AC_SUBST(INSTALL) AC_STEPMAKE_DATADIR ]) @@ -424,6 +427,9 @@ AC_DEFUN(AC_STEPMAKE_YODL, [ AC_SUBST(YODL2TXT) export YODL YODL2HTML YODL2LATEX YODL2MAN YODL2TEXINFO YODL2TXT fi + if test "x$YODL" = "-echo no yodl"; then + AC_STEPMAKE_WARN(Did not find YODL (Yodl is Yet Oneother Document Language, see http://www.cs.uu.nl/~hanwen/yodl)) + fi ]) dnl should cache result. diff --git a/config.make.in b/config.make.in index 9aecaf66f2..25bfe5945a 100644 --- a/config.make.in +++ b/config.make.in @@ -38,6 +38,7 @@ DEFS = @DEFS@ DEFINES = @DEFS@ @DEFINES@ COMPILEINFO = @COMPILEINFO@ DOTEXE = @DOTEXE@ +INSTALL = @INSTALL@ BASH = @BASH@ BISON = @BISON@ FIND = @FIND@ diff --git a/configure b/configure index 2dd916582d..493ae9c0e3 100755 --- a/configure +++ b/configure @@ -878,13 +878,16 @@ fi LN=cp # hard link does not work under cygnus-nt (yet?) ZIP="zip -r -9" # DOTEXE=.exe + INSTALL="\$(stepdir)/../bin/install-dot-exe.sh -c" else LN=ln ZIP="zip -r -9" + INSTALL="\$(stepdir)/../bin/install-sh -c" fi + if test "$datadir" = "\${prefix}/share"; then @@ -1002,7 +1005,7 @@ EOF # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1006: checking for $ac_word" >&5 +echo "configure:1009: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1031,7 +1034,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1035: checking for $ac_word" >&5 +echo "configure:1038: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1079,7 +1082,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1083: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:1086: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1089,11 +1092,11 @@ ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <<EOF -#line 1093 "configure" +#line 1096 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:1097: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1100: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1113,12 +1116,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1117: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1120: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1122: checking whether we are using GNU C" >&5 +echo "configure:1125: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1127,7 +1130,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1131: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1134: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -1142,7 +1145,7 @@ if test $ac_cv_prog_gcc = yes; then ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:1146: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:1149: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1199,7 +1202,7 @@ EOF fi echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6 -echo "configure:1203: checking how to run the C++ preprocessor" >&5 +echo "configure:1206: checking how to run the C++ preprocessor" >&5 if test -z "$CXXCPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1212,12 +1215,12 @@ ac_link='${CXX-g++} -o conftest $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $L cross_compiling=$ac_cv_prog_cxx_cross CXXCPP="${CXX-g++} -E" cat > conftest.$ac_ext <<EOF -#line 1216 "configure" +#line 1219 "configure" #include "confdefs.h" #include <stdlib.h> EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1221: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1224: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -1248,7 +1251,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:1252: checking for $ac_word" >&5 +echo "configure:1255: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1279,7 +1282,7 @@ test -n "$CXX" || CXX="gcc" echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1283: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 +echo "configure:1286: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 ac_ext=C # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1289,11 +1292,11 @@ ac_link='${CXX-g++} -o conftest $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $L cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext <<EOF -#line 1293 "configure" +#line 1296 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:1297: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1300: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then ac_cv_prog_cxx_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1313,12 +1316,12 @@ if test $ac_cv_prog_cxx_works = no; then { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1317: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1320: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 cross_compiling=$ac_cv_prog_cxx_cross echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 -echo "configure:1322: checking whether we are using GNU C++" >&5 +echo "configure:1325: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1327,7 +1330,7 @@ else yes; #endif EOF -if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1331: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1334: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no @@ -1342,7 +1345,7 @@ if test $ac_cv_prog_gxx = yes; then ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 -echo "configure:1346: checking whether ${CXX-g++} accepts -g" >&5 +echo "configure:1349: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1372,17 +1375,17 @@ fi ac_safe=`echo "FlexLexer.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for FlexLexer.h""... $ac_c" 1>&6 -echo "configure:1376: checking for FlexLexer.h" >&5 +echo "configure:1379: checking for FlexLexer.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1381 "configure" +#line 1384 "configure" #include "confdefs.h" #include <FlexLexer.h> EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1386: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1389: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -1431,12 +1434,12 @@ fi echo $ac_n "checking whether explicit instantiation is needed""... $ac_c" 1>&6 -echo "configure:1435: checking whether explicit instantiation is needed" >&5 +echo "configure:1438: checking whether explicit instantiation is needed" >&5 if eval "test \"`echo '$''{'lily_cv_need_explicit_instantiation'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1440 "configure" +#line 1443 "configure" #include "confdefs.h" template <class T> struct foo { static int baz; }; @@ -1446,7 +1449,7 @@ int main() { return foo<int>::baz; ; return 0; } EOF -if { (eval echo configure:1450: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1453: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* lily_cv_need_explicit_instantiation=no else @@ -1473,7 +1476,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:1477: checking for $ac_word" >&5 +echo "configure:1480: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1515,7 +1518,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:1519: checking for $ac_word" >&5 +echo "configure:1522: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_BISON'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1549,7 +1552,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:1553: checking for $ac_word" >&5 +echo "configure:1556: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_FLEX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1616,7 +1619,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:1620: checking for $ac_word" >&5 +echo "configure:1623: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1648,7 +1651,7 @@ test -n "$AR" || AR="error" # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1652: checking for $ac_word" >&5 +echo "configure:1655: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1703,7 +1706,7 @@ fi echo $ac_n "checking language""... $ac_c" 1>&6 -echo "configure:1707: checking language" >&5 +echo "configure:1710: checking language" >&5 case "$language" in En* | en* | Am* | am* | US* | us*) lang=English;; @@ -1739,7 +1742,7 @@ EOF echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6 -echo "configure:1743: checking for gettext in -lintl" >&5 +echo "configure:1746: checking for gettext in -lintl" >&5 ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1747,7 +1750,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lintl $LIBS" cat > conftest.$ac_ext <<EOF -#line 1751 "configure" +#line 1754 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus @@ -1761,7 +1764,7 @@ int main() { gettext() ; return 0; } EOF -if { (eval echo configure:1765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1768: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1791,12 +1794,12 @@ fi for ac_func in gettext do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:1795: checking for $ac_func" >&5 +echo "configure:1798: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1800 "configure" +#line 1803 "configure" #include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func(); below. */ @@ -1822,7 +1825,7 @@ $ac_func(); ; return 0; } EOF -if { (eval echo configure:1826: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1829: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -1848,12 +1851,13 @@ done + # AC_CHECK_PROGS(MSGFMT, msgfmt, -echo no msgfmt) for ac_prog in msgfmt 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:1857: checking for $ac_word" >&5 +echo "configure:1861: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_MSGFMT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1880,21 +1884,27 @@ fi test -n "$MSGFMT" && break done -test -n "$MSGFMT" || MSGFMT="-echo no msgfmt" +test -n "$MSGFMT" || MSGFMT="\$(SHELL) \$(step-bindir)/fake-msgfmt.sh" echo $ac_n "checking whether msgfmt accepts -o""... $ac_c" 1>&6 -echo "configure:1887: checking whether msgfmt accepts -o" >&5 +echo "configure:1891: checking whether msgfmt accepts -o" >&5 msgfmt_output="`msgfmt -o bla 2>&1 | grep usage`" if test "$msgfmt_output" = ""; then echo "$ac_t""yes" 1>&6 else # urg - MSGFMT="touch ; echo " + MSGFMT="\$(SHELL) \$(step-bindir)/fake-msgfmt.sh)" echo "$ac_t""no" 1>&6 echo "configure: warning: please install msgfmt from GNU gettext" 1>&2 warn_b=yes + fi + if test ! -n "$MSGFMT"; then + + echo "configure: warning: please install msgfmt from GNU gettext" 1>&2 + warn_b=yes + fi @@ -1930,7 +1940,7 @@ fi echo $ac_n "checking TeX/MF root dir directory""... $ac_c" 1>&6 -echo "configure:1934: checking TeX/MF root dir directory" >&5 +echo "configure:1944: checking TeX/MF root dir directory" >&5 find_root_prefix="$prefix" @@ -1971,7 +1981,7 @@ echo "configure:1934: checking TeX/MF root dir directory" >&5 echo $ac_n "checking MF input directory""... $ac_c" 1>&6 -echo "configure:1975: checking MF input directory" >&5 +echo "configure:1985: checking MF input directory" >&5 find_dirdir=`(cd $find_texprefix; $FIND ./ -type d -a -name source -print |sort|head -1|sed 's#^\./##')` @@ -1996,7 +2006,7 @@ echo "configure:1975: checking MF input directory" >&5 echo $ac_n "checking TeX input directory""... $ac_c" 1>&6 -echo "configure:2000: checking TeX input directory" >&5 +echo "configure:2010: checking TeX input directory" >&5 find_dirdir=`(cd $find_texprefix; $FIND ./ -type d -a -name tex -print |sort|head -1|sed 's#^\./##')` @@ -2027,7 +2037,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:2031: checking for $ac_word" >&5 +echo "configure:2041: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YODL'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2061,7 +2071,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:2065: checking for $ac_word" >&5 +echo "configure:2075: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YODL2HTML'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2095,7 +2105,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:2099: checking for $ac_word" >&5 +echo "configure:2109: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YODL2LATEX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2128,7 +2138,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:2132: checking for $ac_word" >&5 +echo "configure:2142: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YODL2MAN'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2162,7 +2172,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:2166: checking for $ac_word" >&5 +echo "configure:2176: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YODL2TEXINFO'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2196,7 +2206,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:2200: checking for $ac_word" >&5 +echo "configure:2210: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YODL2TXT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2234,6 +2244,12 @@ test -n "$YODL2TXT" || YODL2TXT="-echo no yodl" export YODL YODL2HTML YODL2LATEX YODL2MAN YODL2TEXINFO YODL2TXT fi + if test "x$YODL" = "-echo no yodl"; then + + echo "configure: warning: Did not find YODL (Yodl is Yet Oneother Document Language, see http://www.cs.uu.nl/~hanwen/yodl)" 1>&2 + warn_b=yes + + fi @@ -2248,7 +2264,7 @@ test -n "$YODL2TXT" || YODL2TXT="-echo no yodl" echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6 -echo "configure:2252: checking for 8-bit clean memcmp" >&5 +echo "configure:2268: 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 @@ -2256,7 +2272,7 @@ else ac_cv_func_memcmp_clean=no else cat > conftest.$ac_ext <<EOF -#line 2260 "configure" +#line 2276 "configure" #include "confdefs.h" #ifdef __cplusplus extern "C" void exit(int); @@ -2269,7 +2285,7 @@ main() } EOF -if { (eval echo configure:2273: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +if { (eval echo configure:2289: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then ac_cv_func_memcmp_clean=yes else @@ -2287,12 +2303,12 @@ echo "$ac_t""$ac_cv_func_memcmp_clean" 1>&6 test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.o" echo $ac_n "checking for vprintf""... $ac_c" 1>&6 -echo "configure:2291: checking for vprintf" >&5 +echo "configure:2307: checking for vprintf" >&5 if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 2296 "configure" +#line 2312 "configure" #include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, which can conflict with char vprintf(); below. */ @@ -2318,7 +2334,7 @@ vprintf(); ; return 0; } EOF -if { (eval echo configure:2322: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2338: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_vprintf=yes" else @@ -2342,12 +2358,12 @@ fi if test "$ac_cv_func_vprintf" != yes; then echo $ac_n "checking for _doprnt""... $ac_c" 1>&6 -echo "configure:2346: checking for _doprnt" >&5 +echo "configure:2362: checking for _doprnt" >&5 if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 2351 "configure" +#line 2367 "configure" #include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, which can conflict with char _doprnt(); below. */ @@ -2373,7 +2389,7 @@ _doprnt(); ; return 0; } EOF -if { (eval echo configure:2377: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2393: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func__doprnt=yes" else @@ -2400,12 +2416,12 @@ fi for ac_func in memmem snprintf vsnprintf gettext do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:2404: checking for $ac_func" >&5 +echo "configure:2420: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 2409 "configure" +#line 2425 "configure" #include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func(); below. */ @@ -2431,7 +2447,7 @@ $ac_func(); ; return 0; } EOF -if { (eval echo configure:2435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2451: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -2470,7 +2486,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:2474: checking for $ac_word" >&5 +echo "configure:2490: 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 @@ -2661,6 +2677,7 @@ s%@PYTHON@%$PYTHON%g s%@DOTEXE@%$DOTEXE%g s%@ZIP@%$ZIP%g s%@LN@%$LN%g +s%@INSTALL@%$INSTALL%g s%@DIR_DATADIR@%$DIR_DATADIR%g s%@subdirs@%$subdirs%g s%@CC@%$CC%g diff --git a/flower/include/scalar.hh b/flower/include/scalar.hh index a963a2fb2a..8f442d9041 100644 --- a/flower/include/scalar.hh +++ b/flower/include/scalar.hh @@ -12,7 +12,6 @@ #include "string.hh" #include "real.hh" -#include "matrix.hh" /// Perl -like scalar type. struct Scalar : public String @@ -34,8 +33,8 @@ struct Scalar : public String urg, these are bit silly; perhaps should make "Print_string" class (derive from Scalar?) */ - Scalar (Vector v) { *this = v.str (); } - Scalar (Matrix m) { *this = m.str (); } + Scalar (Vector const &v); + Scalar (Matrix const &m); /** perl -like string to bool conversion. */ diff --git a/flower/scalar.cc b/flower/scalar.cc index c1f69eda60..7008880ccc 100644 --- a/flower/scalar.cc +++ b/flower/scalar.cc @@ -10,6 +10,7 @@ #include <stdio.h> #include "scalar.hh" #include "rational.hh" +#include "matrix.hh" Scalar::Scalar (Rational r) { @@ -72,3 +73,13 @@ Scalar::to_bool () const return false; return true; } + +Scalar::Scalar(Matrix const &m) +{ + *this = m.str (); +} + +Scalar::Scalar (Vector const &v) +{ + *this = v.str (); +} diff --git a/input/Makefile b/input/Makefile index b557d18d4b..1919c9e343 100644 --- a/input/Makefile +++ b/input/Makefile @@ -12,3 +12,6 @@ flexamples=example-1 example-2 include $(stepdir)/WWW.make + +local-check: $(addsuffix .dvi, $(addprefix $(outdir)/, $(examples))) + diff --git a/lily/VERSION b/lily/VERSION index b79339f1e0..36dc14b269 100644 --- a/lily/VERSION +++ b/lily/VERSION @@ -1,8 +1,8 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=0 -PATCH_LEVEL=1 -MY_PATCH_LEVEL=jcn2 +PATCH_LEVEL=2 +MY_PATCH_LEVEL= # use the above to send patches, always empty for released version: # please don't move these comments up; the patch should fail if diff --git a/lily/text-def.cc b/lily/text-def.cc index faf0dae1c4..b0dbaf5611 100644 --- a/lily/text-def.cc +++ b/lily/text-def.cc @@ -26,6 +26,9 @@ Text_def::width (Paper_def * p) const { Atom a = get_atom (p,CENTER); + /* TODO: check string for \texcommand + */ + Real guess_width_f = text_str_.length_i() * a.dim_.x ().length (); // ugh Interval i (0, guess_width_f); i += - (align_dir_ + 1)* i.center(); diff --git a/make/STATE-VECTOR b/make/STATE-VECTOR index a546effdaa..0ed7c75c4e 100644 --- a/make/STATE-VECTOR +++ b/make/STATE-VECTOR @@ -58,5 +58,7 @@ 1.0.0.hwn1 1.0.0.hwn2 1.0.1 -1.0.1.jcn1 +1.0.1.jbr1 1.0.1.jcn2 +1.0.1.jbr2 +1.0.2 diff --git a/make/out/lelievijver.lsm b/make/out/lelievijver.lsm index 7bf75efad3..6261f091c4 100644 --- a/make/out/lelievijver.lsm +++ b/make/out/lelievijver.lsm @@ -1,7 +1,7 @@ Begin3 Titel: LilyPond -Versie: 1.0.1 -Inschrijf datum: 10AUG98 +Versie: 1.0.2 +Inschrijf datum: 13AUG98 Beschrijving: LilyPond is de muziekzetter van het GNU Project. Dit programma drukt prachtige bladmuziek volgens een muzikaal definitie bestand. Ook kan @@ -15,8 +15,8 @@ Auteur: hanwen@stack.nl (Han-Wen Nienhuys) janneke@gnu.org (Jan Nieuwenhuizen) Onderhouden door: hanwen@cs.ruu.nl (Han-Wen Nienhuys) Voornaamste plek: sunsite.unc.edu /pub/Linux/apps - 610k lilypond-1.0.1.tar.gz + 610k lilypond-1.0.2.tar.gz Oorspronkelijke plek: pcnov095.win.tue.nl /pub/lilypond/ - 610k lilypond-1.0.1.tar.gz + 610k lilypond-1.0.2.tar.gz Copi-eer voorwaarden: GPL End diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm index 72bc7aa147..43dcdc13b7 100644 --- a/make/out/lilypond.lsm +++ b/make/out/lilypond.lsm @@ -1,7 +1,7 @@ Begin3 Title: LilyPond -Version: 1.0.1 -Entered-date: 10AUG98 +Version: 1.0.2 +Entered-date: 13AUG98 Description: LilyPond is the GNU Project music typesetter. This program can print beautiful sheet music from a music definition file. It can also play @@ -14,8 +14,8 @@ Author: hanwen@cs.ruu.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 - 730k lilypond-1.0.1.tar.gz + 730k lilypond-1.0.2.tar.gz Original-site: pcnov095.win.tue.nl /pub/lilypond/development/ - 730k lilypond-1.0.1.tar.gz + 730k lilypond-1.0.2.tar.gz Copying-policy: GPL End diff --git a/make/out/lilypond.spec b/make/out/lilypond.spec index e55a3909fc..fbb5522752 100644 --- a/make/out/lilypond.spec +++ b/make/out/lilypond.spec @@ -1,9 +1,9 @@ Name: lilypond -Version: 1.0.1 +Version: 1.0.2 Release: 1 Copyright: GPL Group: Applications/Publishing -Source0: pcnov095.win.tue.nl:/pub/lilypond/development/lilypond-1.0.1.tar.gz +Source0: pcnov095.win.tue.nl:/pub/lilypond/development/lilypond-1.0.2.tar.gz Summary: A program for typesetting music. URL: http://www.cs.uu.nl/~hanwen/lilypond Packager: Han-Wen Nienhuys <hanwen@cs.uu.nl> diff --git a/make/out/zlilypond-docs.spec b/make/out/zlilypond-docs.spec index 09ba175731..1757826f70 100644 --- a/make/out/zlilypond-docs.spec +++ b/make/out/zlilypond-docs.spec @@ -4,11 +4,11 @@ # Name: lilypond-docs -Version: 1.0.1 +Version: 1.0.2 Release: 1 Copyright: GPL Group: Applications/Publishing -Source0: pcnov095.win.tue.nl:/pub/lilypond/development/lilypond-1.0.1.tar.gz +Source0: pcnov095.win.tue.nl:/pub/lilypond/development/lilypond-1.0.2.tar.gz Summary: A program for typesetting music (documentation) URL: http://www.cs.uu.nl/~hanwen/lilypond Packager: Han-Wen Nienhuys <hanwen@cs.uu.nl> @@ -29,7 +29,7 @@ a nice font of musical symbols. This package contains the documentation in HTML and PS format. %prep -%setup -T -n lilypond-1.0.1 -b0 +%setup -T -n lilypond-1.0.2 -b0 %build # @@ -42,11 +42,11 @@ make htmldocs %install # ln /home/hanwen/usr/src/lilypond/out/htmldoc.tar.gz out/ -mkdir -p $RPM_BUILD_ROOT/usr/doc/lilypond-1.0.1 -tar -C $RPM_BUILD_ROOT/usr/doc/lilypond-1.0.1 -xzf out/htmldoc.tar.gz +mkdir -p $RPM_BUILD_ROOT/usr/doc/lilypond-1.0.2 +tar -C $RPM_BUILD_ROOT/usr/doc/lilypond-1.0.2 -xzf out/htmldoc.tar.gz %files -%doc /usr/doc/lilypond-1.0.1 +%doc /usr/doc/lilypond-1.0.2 %post diff --git a/mf/Makefile b/mf/Makefile index 42c18fec88..407ce8ea27 100644 --- a/mf/Makefile +++ b/mf/Makefile @@ -14,7 +14,11 @@ LYTABLES = $(addprefix $(outdir)/, $(FET_FILES:.mf=.ly)) LOG_FILES = $(addprefix $(outdir)/, $(FET_FILES:.mf=.log)) TEXTABLES = $(addprefix $(outdir)/, $(FET_FILES:.mf=.tex)) AFM_FILES = $(addprefix $(outdir)/, $(FET_FILES:.mf=.afm)) + ALL_GEN_FILES=$(LYTABLES) $(TEXTABLES) $(LOG_FILES) $(AFM_FILES) + +OUT_DIST_FILES += $(AFM_FILES) + default: $(ALL_GEN_FILES) diff --git a/mf/out/feta11.afm b/mf/out/feta11.afm new file mode 100644 index 0000000000..cc6148945b --- /dev/null +++ b/mf/out/feta11.afm @@ -0,0 +1,76 @@ +FontName feta +StartFontMetrics +StartCharMetrics +C 0; N rests-0; B 0.00 -1718.75 4125.00 0.00 ; +C 1; N rests-1; B 0.00 0.00 4125.00 1718.75 ; +C 2; N rests-0o; B -1718.75 -1718.75 5843.75 275.02 ; +C 3; N rests-1o; B -1718.75 -275.02 5843.75 1718.75 ; +C 4; N rests--1; B 0.00 0.00 1650.00 2750.00 ; +C 5; N rests--2; B 0.00 -2750.00 1650.00 2750.00 ; +C 6; N rests-2; B 0.00 2062.50 2970.00 9900.02 ; +C 7; N rests-3; B 0.00 2750.00 3666.66 7814.64 ; +C 8; N rests-4; B 0.00 0.00 4266.33 7814.64 ; +C 9; N rests-5; B 0.00 0.00 4813.96 10564.64 ; +C 10; N rests-6; B 0.00 0.00 5161.70 13314.64 ; +C 11; N rests-7; B 0.00 0.00 5746.25 16064.64 ; +C 12; N accidentals-1; B 0.00 -4125.00 3025.02 4125.00 ; +C 13; N accidentals-0; B 0.00 -4125.00 1833.33 4125.00 ; +C 14; N accidentals--1; B -330.03 -1375.00 2200.01 5500.00 ; +C 15; N accidentals--2; B -330.03 -1375.00 3987.49 5500.00 ; +C 16; N accidentals-2; B 0.00 -1375.00 2750.00 1375.00 ; +C 17; N dots-dot; B 0.00 -618.74 1237.49 618.74 ; +C 18; N dots-repeatcolon; B 0.00 -1375.00 1237.49 1375.00 ; +C 19; N balls--1; B 0.00 -1512.51 5500.00 1512.51 ; +C 20; N balls--1l; B -1375.00 -275.02 6875.00 275.02 ; +C 21; N balls--2; B 0.00 -1512.51 5500.00 1512.51 ; +C 22; N balls--2l; B -1375.00 -275.02 6875.00 275.02 ; +C 23; N balls-0; B 0.00 -1512.51 5445.07 1512.51 ; +C 24; N balls-0l; B -1361.27 -275.02 6806.34 275.02 ; +C 25; N balls-1; B 0.00 -1512.51 3788.07 1512.51 ; +C 26; N balls-1l; B -947.02 -275.02 4735.09 275.02 ; +C 27; N balls-2; B 0.00 -1512.51 3632.84 1512.51 ; +C 28; N balls-2l; B -908.22 -275.02 4541.06 275.02 ; +C 29; N scripts-ufermata; B -3643.77 -206.27 3643.77 3987.55 ; +C 30; N scripts-dfermata; B -3643.77 -3987.55 3643.77 206.27 ; +C 31; N scripts-sforzato; B -2474.99 -1375.00 2474.99 1375.00 ; +C 32; N scripts-staccato; B -412.54 -412.54 412.54 412.54 ; +C 33; N scripts-ustaccatissimo; B -550.05 -200.00 550.05 2750.06 ; +C 34; N scripts-dstaccatissimo; B -550.05 -2750.06 550.05 200.00 ; +C 35; N scripts-tenuto; B -1650.02 -192.52 1650.02 192.52 ; +C 36; N scripts-umarcato; B -1375.00 0.00 1375.00 3025.02 ; +C 37; N scripts-dmarcato; B -1375.00 -3025.02 1375.00 0.00 ; +C 38; N scripts-open; B -1100.00 -1375.00 1100.00 1375.00 ; +C 39; N scripts-stopped; B -1512.51 -1512.51 1512.51 1512.51 ; +C 40; N scripts-upbow; B -1787.50 0.00 1787.50 5720.05 ; +C 41; N scripts-downbow; B -2062.50 0.00 2062.50 3666.66 ; +C 42; N scripts-reverseturn; B -3007.81 -1455.89 3007.81 1455.89 ; +C 43; N scripts-turn; B -3007.81 -1455.89 3007.81 1455.89 ; +C 44; N scripts-trill; B -2750.00 0.00 2750.00 6187.50 ; +C 45; N scripts-upedalheel; B -1375.00 -1375.00 1375.00 1833.33 ; +C 46; N scripts-dpedalheel; B -1375.00 -1833.33 1375.00 1375.00 ; +C 47; N scripts-upedaltoe; B -1375.00 0.00 1375.00 4125.00 ; +C 48; N scripts-dpedaltoe; B -1375.00 -4125.00 1375.00 0.00 ; +C 49; N scripts-flageolet; B -1466.67 -1466.67 1466.67 1466.67 ; +C 50; N scripts-trilelement; B -1833.33 -1375.00 718.64 1375.00 ; +C 51; N scripts-prall; B -3109.31 -1375.00 3109.31 1375.00 ; +C 52; N scripts-mordent; B -3109.31 -1375.00 3109.31 1375.00 ; +C 53; N scripts-prallprall; B -4385.30 -1375.00 4385.30 1375.00 ; +C 54; N scripts-prallmordent; B -4385.30 -1375.00 4385.30 1375.00 ; +C 55; N scripts-upprall; B -4385.30 -1375.00 4385.30 1375.00 ; +C 56; N scripts-downprall; B -4385.30 -1375.00 4385.30 1375.00 ; +C 57; N flags-u3; B -137.51 -8428.77 3393.31 137.51 ; +C 58; N flags-u4; B -137.51 -9803.77 3393.31 137.51 ; +C 59; N flags-u5; B -137.51 -11866.27 3393.31 137.51 ; +C 60; N flags-u6; B -137.51 -14616.27 3393.31 137.51 ; +C 61; N flags-d3; B -137.51 -137.51 3755.11 8016.30 ; +C 62; N flags-d4; B -137.51 -137.51 3755.11 8428.77 ; +C 63; N flags-d5; B -137.51 -137.51 3755.11 10766.30 ; +C 64; N flags-d6; B -137.51 -137.51 3755.11 12141.30 ; +C 65; N clefs-alto; B -2750.00 -5500.00 10236.10 5500.00 ; +C 66; N clefs-alto_change; B -2200.01 -4400.02 8188.93 4400.02 ; +C 67; N clefs-bass; B -1375.00 -6875.00 9900.02 2750.00 ; +C 68; N clefs-bass_change; B -1100.02 -5500.03 7920.04 2200.01 ; +C 69; N clefs-violin; B -2396.44 -8250.00 10277.13 13750.00 ; +C 70; N clefs-violin_change; B -2082.15 -6600.04 8056.75 11000.06 ; +EndCharMetrics +EndFontMetrics diff --git a/mf/out/feta13.afm b/mf/out/feta13.afm new file mode 100644 index 0000000000..b122ce708f --- /dev/null +++ b/mf/out/feta13.afm @@ -0,0 +1,76 @@ +FontName feta +StartFontMetrics +StartCharMetrics +C 0; N rests-0; B 0.00 -2031.25 4875.00 0.00 ; +C 1; N rests-1; B 0.00 0.00 4875.00 2031.25 ; +C 2; N rests-0o; B -2031.25 -2031.25 6906.25 325.03 ; +C 3; N rests-1o; B -2031.25 -325.03 6906.25 2031.25 ; +C 4; N rests--1; B 0.00 0.00 1950.00 3250.00 ; +C 5; N rests--2; B 0.00 -3250.00 1950.00 3250.00 ; +C 6; N rests-2; B 0.00 2437.50 3510.01 11700.03 ; +C 7; N rests-3; B 0.00 3250.00 4333.31 9235.49 ; +C 8; N rests-4; B 0.00 0.00 5042.04 9235.49 ; +C 9; N rests-5; B 0.00 0.00 5689.25 12485.49 ; +C 10; N rests-6; B 0.00 0.00 6100.20 15735.49 ; +C 11; N rests-7; B 0.00 0.00 6791.03 18985.49 ; +C 12; N accidentals-1; B 0.00 -4875.00 3575.03 4875.00 ; +C 13; N accidentals-0; B 0.00 -4875.00 2166.67 4875.00 ; +C 14; N accidentals--1; B -390.03 -1625.00 2600.00 6500.00 ; +C 15; N accidentals--2; B -390.03 -1625.00 4712.50 6500.00 ; +C 16; N accidentals-2; B 0.00 -1625.00 3250.00 1625.00 ; +C 17; N dots-dot; B 0.00 -731.25 1462.50 731.25 ; +C 18; N dots-repeatcolon; B 0.00 -1625.00 1462.50 1625.00 ; +C 19; N balls--1; B 0.00 -1787.52 6500.00 1787.52 ; +C 20; N balls--1l; B -1625.00 -325.03 8125.00 325.03 ; +C 21; N balls--2; B 0.00 -1787.52 6500.00 1787.52 ; +C 22; N balls--2l; B -1625.00 -325.03 8125.00 325.03 ; +C 23; N balls-0; B 0.00 -1787.52 6435.09 1787.52 ; +C 24; N balls-0l; B -1608.78 -325.03 8043.87 325.03 ; +C 25; N balls-1; B 0.00 -1787.52 4476.79 1787.52 ; +C 26; N balls-1l; B -1119.20 -325.03 5596.00 325.03 ; +C 27; N balls-2; B 0.00 -1787.52 4293.33 1787.52 ; +C 28; N balls-2l; B -1073.33 -325.03 5366.67 325.03 ; +C 29; N scripts-ufermata; B -4306.27 -243.77 4306.27 4712.55 ; +C 30; N scripts-dfermata; B -4306.27 -4712.55 4306.27 243.77 ; +C 31; N scripts-sforzato; B -2924.99 -1625.00 2924.99 1625.00 ; +C 32; N scripts-staccato; B -487.55 -487.55 487.55 487.55 ; +C 33; N scripts-ustaccatissimo; B -650.05 -200.00 650.05 3250.06 ; +C 34; N scripts-dstaccatissimo; B -650.05 -3250.06 650.05 200.00 ; +C 35; N scripts-tenuto; B -1950.03 -227.52 1950.03 227.52 ; +C 36; N scripts-umarcato; B -1625.00 0.00 1625.00 3575.03 ; +C 37; N scripts-dmarcato; B -1625.00 -3575.03 1625.00 0.00 ; +C 38; N scripts-open; B -1300.00 -1625.00 1300.00 1625.00 ; +C 39; N scripts-stopped; B -1787.52 -1787.52 1787.52 1787.52 ; +C 40; N scripts-upbow; B -2112.50 0.00 2112.50 6760.04 ; +C 41; N scripts-downbow; B -2437.50 0.00 2437.50 4333.31 ; +C 42; N scripts-reverseturn; B -3554.69 -1720.60 3554.69 1720.60 ; +C 43; N scripts-turn; B -3554.69 -1720.60 3554.69 1720.60 ; +C 44; N scripts-trill; B -3250.00 0.00 3250.00 7312.50 ; +C 45; N scripts-upedalheel; B -1625.00 -1625.00 1625.00 2166.67 ; +C 46; N scripts-dpedalheel; B -1625.00 -2166.67 1625.00 1625.00 ; +C 47; N scripts-upedaltoe; B -1625.00 0.00 1625.00 4875.00 ; +C 48; N scripts-dpedaltoe; B -1625.00 -4875.00 1625.00 0.00 ; +C 49; N scripts-flageolet; B -1733.34 -1733.34 1733.34 1733.34 ; +C 50; N scripts-trilelement; B -2166.67 -1625.00 849.30 1625.00 ; +C 51; N scripts-prall; B -3674.65 -1625.00 3674.65 1625.00 ; +C 52; N scripts-mordent; B -3674.65 -1625.00 3674.65 1625.00 ; +C 53; N scripts-prallprall; B -5182.63 -1625.00 5182.63 1625.00 ; +C 54; N scripts-prallmordent; B -5182.63 -1625.00 5182.63 1625.00 ; +C 55; N scripts-upprall; B -5182.63 -1625.00 5182.63 1625.00 ; +C 56; N scripts-downprall; B -5182.63 -1625.00 5182.63 1625.00 ; +C 57; N flags-u3; B -162.52 -9961.27 4010.27 162.52 ; +C 58; N flags-u4; B -162.52 -11586.27 4010.27 162.52 ; +C 59; N flags-u5; B -162.52 -14023.77 4010.27 162.52 ; +C 60; N flags-u6; B -162.52 -17273.77 4010.27 162.52 ; +C 61; N flags-d3; B -162.52 -162.52 4437.84 9473.80 ; +C 62; N flags-d4; B -162.52 -162.52 4437.84 9961.27 ; +C 63; N flags-d5; B -162.52 -162.52 4437.84 12723.80 ; +C 64; N flags-d6; B -162.52 -162.52 4437.84 14348.80 ; +C 65; N clefs-alto; B -3250.00 -6500.00 12097.24 6500.00 ; +C 66; N clefs-alto_change; B -2600.00 -5200.01 9677.81 5200.01 ; +C 67; N clefs-bass; B -1625.00 -8125.00 11700.03 3250.00 ; +C 68; N clefs-bass_change; B -1300.02 -6500.02 9360.02 2600.00 ; +C 69; N clefs-violin; B -2832.14 -9750.00 12145.70 16250.00 ; +C 70; N clefs-violin_change; B -2460.72 -7800.02 9521.58 13000.03 ; +EndCharMetrics +EndFontMetrics diff --git a/mf/out/feta16.afm b/mf/out/feta16.afm new file mode 100644 index 0000000000..d4f7310b93 --- /dev/null +++ b/mf/out/feta16.afm @@ -0,0 +1,76 @@ +FontName feta +StartFontMetrics +StartCharMetrics +C 0; N rests-0; B 0.00 -2500.00 6000.00 0.00 ; +C 1; N rests-1; B 0.00 0.00 6000.00 2500.00 ; +C 2; N rests-0o; B -2500.00 -2500.00 8500.00 400.02 ; +C 3; N rests-1o; B -2500.00 -400.02 8500.00 2500.00 ; +C 4; N rests--1; B 0.00 0.00 2400.00 4000.00 ; +C 5; N rests--2; B 0.00 -4000.00 2400.00 4000.00 ; +C 6; N rests-2; B 0.00 3000.00 4320.00 14400.02 ; +C 7; N rests-3; B 0.00 4000.00 5333.31 11366.73 ; +C 8; N rests-4; B 0.00 0.00 6205.57 11366.73 ; +C 9; N rests-5; B 0.00 0.00 7002.14 15366.73 ; +C 10; N rests-6; B 0.00 0.00 7507.93 19366.73 ; +C 11; N rests-7; B 0.00 0.00 8358.18 23366.73 ; +C 12; N accidentals-1; B 0.00 -6000.00 4400.02 6000.00 ; +C 13; N accidentals-0; B 0.00 -6000.00 2666.67 6000.00 ; +C 14; N accidentals--1; B -480.03 -2000.00 3200.01 8000.00 ; +C 15; N accidentals--2; B -480.03 -2000.00 5799.99 8000.00 ; +C 16; N accidentals-2; B 0.00 -2000.00 4000.00 2000.00 ; +C 17; N dots-dot; B 0.00 -900.00 1799.99 900.00 ; +C 18; N dots-repeatcolon; B 0.00 -2000.00 1799.99 2000.00 ; +C 19; N balls--1; B 0.00 -2200.01 8000.00 2200.01 ; +C 20; N balls--1l; B -2000.00 -400.02 10000.00 400.02 ; +C 21; N balls--2; B 0.00 -2200.01 8000.00 2200.01 ; +C 22; N balls--2l; B -2000.00 -400.02 10000.00 400.02 ; +C 23; N balls-0; B 0.00 -2200.01 7920.04 2200.01 ; +C 24; N balls-0l; B -1980.01 -400.02 9900.05 400.02 ; +C 25; N balls-1; B 0.00 -2200.01 5509.86 2200.01 ; +C 26; N balls-1l; B -1377.47 -400.02 6887.33 400.02 ; +C 27; N balls-2; B 0.00 -2200.01 5284.09 2200.01 ; +C 28; N balls-2l; B -1321.03 -400.02 6605.12 400.02 ; +C 29; N scripts-ufermata; B -5300.02 -300.02 5300.02 5800.05 ; +C 30; N scripts-dfermata; B -5300.02 -5800.05 5300.02 300.02 ; +C 31; N scripts-sforzato; B -3599.98 -2000.00 3599.98 2000.00 ; +C 32; N scripts-staccato; B -600.04 -600.04 600.04 600.04 ; +C 33; N scripts-ustaccatissimo; B -800.05 -200.00 800.05 4000.06 ; +C 34; N scripts-dstaccatissimo; B -800.05 -4000.06 800.05 200.00 ; +C 35; N scripts-tenuto; B -2400.02 -280.01 2400.02 280.01 ; +C 36; N scripts-umarcato; B -2000.00 0.00 2000.00 4400.02 ; +C 37; N scripts-dmarcato; B -2000.00 -4400.02 2000.00 0.00 ; +C 38; N scripts-open; B -1600.00 -2000.00 1600.00 2000.00 ; +C 39; N scripts-stopped; B -2200.01 -2200.01 2200.01 2200.01 ; +C 40; N scripts-upbow; B -2600.00 0.00 2600.00 8320.05 ; +C 41; N scripts-downbow; B -3000.00 0.00 3000.00 5333.31 ; +C 42; N scripts-reverseturn; B -4375.00 -2117.65 4375.00 2117.65 ; +C 43; N scripts-turn; B -4375.00 -2117.65 4375.00 2117.65 ; +C 44; N scripts-trill; B -4000.00 0.00 4000.00 9000.00 ; +C 45; N scripts-upedalheel; B -2000.00 -2000.00 2000.00 2666.67 ; +C 46; N scripts-dpedalheel; B -2000.00 -2666.67 2000.00 2000.00 ; +C 47; N scripts-upedaltoe; B -2000.00 0.00 2000.00 6000.00 ; +C 48; N scripts-dpedaltoe; B -2000.00 -6000.00 2000.00 0.00 ; +C 49; N scripts-flageolet; B -2133.33 -2133.33 2133.33 2133.33 ; +C 50; N scripts-trilelement; B -2666.67 -2000.00 1045.30 2000.00 ; +C 51; N scripts-prall; B -4522.66 -2000.00 4522.66 2000.00 ; +C 52; N scripts-mordent; B -4522.66 -2000.00 4522.66 2000.00 ; +C 53; N scripts-prallprall; B -6378.65 -2000.00 6378.65 2000.00 ; +C 54; N scripts-prallmordent; B -6378.65 -2000.00 6378.65 2000.00 ; +C 55; N scripts-upprall; B -6378.65 -2000.00 6378.65 2000.00 ; +C 56; N scripts-downprall; B -6378.65 -2000.00 6378.65 2000.00 ; +C 57; N flags-u3; B -200.01 -12260.03 4935.68 200.01 ; +C 58; N flags-u4; B -200.01 -14260.03 4935.68 200.01 ; +C 59; N flags-u5; B -200.01 -17260.03 4935.68 200.01 ; +C 60; N flags-u6; B -200.01 -21260.03 4935.68 200.01 ; +C 61; N flags-d3; B -200.01 -200.01 5461.91 11660.05 ; +C 62; N flags-d4; B -200.01 -200.01 5461.91 12260.03 ; +C 63; N flags-d5; B -200.01 -200.01 5461.91 15660.05 ; +C 64; N flags-d6; B -200.01 -200.01 5461.91 17660.05 ; +C 65; N clefs-alto; B -4000.00 -8000.00 14888.90 8000.00 ; +C 66; N clefs-alto_change; B -3200.01 -6400.02 11911.18 6400.02 ; +C 67; N clefs-bass; B -2000.00 -10000.00 14400.02 4000.00 ; +C 68; N clefs-bass_change; B -1600.04 -8000.03 11520.03 3200.01 ; +C 69; N clefs-violin; B -3485.72 -12000.00 14948.55 20000.00 ; +C 70; N clefs-violin_change; B -3028.58 -9600.04 11718.89 16000.06 ; +EndCharMetrics +EndFontMetrics diff --git a/mf/out/feta19.afm b/mf/out/feta19.afm new file mode 100644 index 0000000000..34cfa44722 --- /dev/null +++ b/mf/out/feta19.afm @@ -0,0 +1,76 @@ +FontName feta +StartFontMetrics +StartCharMetrics +C 0; N rests-0; B 0.00 -2968.75 7125.00 0.00 ; +C 1; N rests-1; B 0.00 0.00 7125.00 2968.75 ; +C 2; N rests-0o; B -2968.75 -2968.75 10093.75 475.04 ; +C 3; N rests-1o; B -2968.75 -475.04 10093.75 2968.75 ; +C 4; N rests--1; B 0.00 0.00 2850.00 4750.00 ; +C 5; N rests--2; B 0.00 -4750.00 2850.00 4750.00 ; +C 6; N rests-2; B 0.00 3562.50 5130.00 17100.04 ; +C 7; N rests-3; B 0.00 4750.00 6333.31 13498.00 ; +C 8; N rests-4; B 0.00 0.00 7369.11 13498.00 ; +C 9; N rests-5; B 0.00 0.00 8315.05 18248.00 ; +C 10; N rests-6; B 0.00 0.00 8915.66 22998.00 ; +C 11; N rests-7; B 0.00 0.00 9925.34 27748.00 ; +C 12; N accidentals-1; B 0.00 -7125.00 5225.04 7125.00 ; +C 13; N accidentals-0; B 0.00 -7125.00 3166.67 7125.00 ; +C 14; N accidentals--1; B -570.04 -2375.00 3800.02 9500.00 ; +C 15; N accidentals--2; B -570.04 -2375.00 6887.48 9500.00 ; +C 16; N accidentals-2; B 0.00 -2375.00 4750.00 2375.00 ; +C 17; N dots-dot; B 0.00 -1068.74 2137.48 1068.74 ; +C 18; N dots-repeatcolon; B 0.00 -2375.00 2137.48 2375.00 ; +C 19; N balls--1; B 0.00 -2612.52 9500.00 2612.52 ; +C 20; N balls--1l; B -2375.00 -475.04 11875.00 475.04 ; +C 21; N balls--2; B 0.00 -2612.52 9500.00 2612.52 ; +C 22; N balls--2l; B -2375.00 -475.04 11875.00 475.04 ; +C 23; N balls-0; B 0.00 -2612.52 9405.09 2612.52 ; +C 24; N balls-0l; B -2351.27 -475.04 11756.36 475.04 ; +C 25; N balls-1; B 0.00 -2612.52 6543.00 2612.52 ; +C 26; N balls-1l; B -1635.76 -475.04 8178.76 475.04 ; +C 27; N balls-2; B 0.00 -2612.52 6274.89 2612.52 ; +C 28; N balls-2l; B -1568.73 -475.04 7843.61 475.04 ; +C 29; N scripts-ufermata; B -6293.78 -356.28 6293.78 6887.57 ; +C 30; N scripts-dfermata; B -6293.78 -6887.57 6293.78 356.28 ; +C 31; N scripts-sforzato; B -4274.98 -2375.00 4274.98 2375.00 ; +C 32; N scripts-staccato; B -712.55 -712.55 712.55 712.55 ; +C 33; N scripts-ustaccatissimo; B -950.07 -200.00 950.07 4750.09 ; +C 34; N scripts-dstaccatissimo; B -950.07 -4750.09 950.07 200.00 ; +C 35; N scripts-tenuto; B -2850.04 -332.53 2850.04 332.53 ; +C 36; N scripts-umarcato; B -2375.00 0.00 2375.00 5225.04 ; +C 37; N scripts-dmarcato; B -2375.00 -5225.04 2375.00 0.00 ; +C 38; N scripts-open; B -1900.01 -2375.00 1900.01 2375.00 ; +C 39; N scripts-stopped; B -2612.52 -2612.52 2612.52 2612.52 ; +C 40; N scripts-upbow; B -3087.51 0.00 3087.51 9880.07 ; +C 41; N scripts-downbow; B -3562.50 0.00 3562.50 6333.31 ; +C 42; N scripts-reverseturn; B -5195.31 -2514.71 5195.31 2514.71 ; +C 43; N scripts-turn; B -5195.31 -2514.71 5195.31 2514.71 ; +C 44; N scripts-trill; B -4750.00 0.00 4750.00 10687.50 ; +C 45; N scripts-upedalheel; B -2375.00 -2375.00 2375.00 3166.67 ; +C 46; N scripts-dpedalheel; B -2375.00 -3166.67 2375.00 2375.00 ; +C 47; N scripts-upedaltoe; B -2375.00 0.00 2375.00 7125.00 ; +C 48; N scripts-dpedaltoe; B -2375.00 -7125.00 2375.00 0.00 ; +C 49; N scripts-flageolet; B -2533.34 -2533.34 2533.34 2533.34 ; +C 50; N scripts-trilelement; B -3166.67 -2375.00 1241.30 2375.00 ; +C 51; N scripts-prall; B -5370.65 -2375.00 5370.65 2375.00 ; +C 52; N scripts-mordent; B -5370.65 -2375.00 5370.65 2375.00 ; +C 53; N scripts-prallprall; B -7574.63 -2375.00 7574.63 2375.00 ; +C 54; N scripts-prallmordent; B -7574.63 -2375.00 7574.63 2375.00 ; +C 55; N scripts-upprall; B -7574.63 -2375.00 7574.63 2375.00 ; +C 56; N scripts-downprall; B -7574.63 -2375.00 7574.63 2375.00 ; +C 57; N flags-u3; B -237.52 -14558.78 5861.15 237.52 ; +C 58; N flags-u4; B -237.52 -16933.78 5861.15 237.52 ; +C 59; N flags-u5; B -237.52 -20496.28 5861.15 237.52 ; +C 60; N flags-u6; B -237.52 -25246.28 5861.15 237.52 ; +C 61; N flags-d3; B -237.52 -237.52 6486.07 13846.31 ; +C 62; N flags-d4; B -237.52 -237.52 6486.07 14558.78 ; +C 63; N flags-d5; B -237.52 -237.52 6486.07 18596.31 ; +C 64; N flags-d6; B -237.52 -237.52 6486.07 20971.31 ; +C 65; N clefs-alto; B -4750.00 -9500.00 17680.59 9500.00 ; +C 66; N clefs-alto_change; B -3800.02 -7600.04 14144.50 7600.04 ; +C 67; N clefs-bass; B -2375.00 -11875.00 17100.04 4750.00 ; +C 68; N clefs-bass_change; B -1900.04 -9500.05 13680.05 3800.02 ; +C 69; N clefs-violin; B -4139.30 -14250.00 17751.40 23750.00 ; +C 70; N clefs-violin_change; B -3596.45 -11400.05 13916.18 19000.09 ; +EndCharMetrics +EndFontMetrics diff --git a/mf/out/feta20.afm b/mf/out/feta20.afm new file mode 100644 index 0000000000..07717c2151 --- /dev/null +++ b/mf/out/feta20.afm @@ -0,0 +1,76 @@ +FontName feta +StartFontMetrics +StartCharMetrics +C 0; N rests-0; B 0.00 -3125.00 7500.00 0.00 ; +C 1; N rests-1; B 0.00 0.00 7500.00 3125.00 ; +C 2; N rests-0o; B -3125.00 -3125.00 10625.00 500.03 ; +C 3; N rests-1o; B -3125.00 -500.03 10625.00 3125.00 ; +C 4; N rests--1; B 0.00 0.00 3000.00 5000.00 ; +C 5; N rests--2; B 0.00 -5000.00 3000.00 5000.00 ; +C 6; N rests-2; B 0.00 3750.00 5400.01 18000.03 ; +C 7; N rests-3; B 0.00 5000.00 6666.64 14208.42 ; +C 8; N rests-4; B 0.00 0.00 7756.96 14208.42 ; +C 9; N rests-5; B 0.00 0.00 8752.69 19208.42 ; +C 10; N rests-6; B 0.00 0.00 9384.92 24208.42 ; +C 11; N rests-7; B 0.00 0.00 10447.72 29208.42 ; +C 12; N accidentals-1; B 0.00 -7500.00 5500.03 7500.00 ; +C 13; N accidentals-0; B 0.00 -7500.00 3333.33 7500.00 ; +C 14; N accidentals--1; B -600.04 -2500.00 4000.02 10000.00 ; +C 15; N accidentals--2; B -600.04 -2500.00 7249.98 10000.00 ; +C 16; N accidentals-2; B 0.00 -2500.00 5000.00 2500.00 ; +C 17; N dots-dot; B 0.00 -1125.00 2249.98 1125.00 ; +C 18; N dots-repeatcolon; B 0.00 -2500.00 2249.98 2500.00 ; +C 19; N balls--1; B 0.00 -2750.02 10000.00 2750.02 ; +C 20; N balls--1l; B -2500.00 -500.03 12500.00 500.03 ; +C 21; N balls--2; B 0.00 -2750.02 10000.00 2750.02 ; +C 22; N balls--2l; B -2500.00 -500.03 12500.00 500.03 ; +C 23; N balls-0; B 0.00 -2750.02 9900.09 2750.02 ; +C 24; N balls-0l; B -2475.02 -500.03 12375.10 500.03 ; +C 25; N balls-1; B 0.00 -2750.02 6887.33 2750.02 ; +C 26; N balls-1l; B -1721.83 -500.03 8609.16 500.03 ; +C 27; N balls-2; B 0.00 -2750.02 6605.15 2750.02 ; +C 28; N balls-2l; B -1651.29 -500.03 8256.44 500.03 ; +C 29; N scripts-ufermata; B -6625.03 -375.03 6625.03 7250.06 ; +C 30; N scripts-dfermata; B -6625.03 -7250.06 6625.03 375.03 ; +C 31; N scripts-sforzato; B -4499.97 -2500.00 4499.97 2500.00 ; +C 32; N scripts-staccato; B -750.05 -750.05 750.05 750.05 ; +C 33; N scripts-ustaccatissimo; B -1000.06 -200.00 1000.06 5000.08 ; +C 34; N scripts-dstaccatissimo; B -1000.06 -5000.08 1000.06 200.00 ; +C 35; N scripts-tenuto; B -3000.03 -350.02 3000.03 350.02 ; +C 36; N scripts-umarcato; B -2500.00 0.00 2500.00 5500.03 ; +C 37; N scripts-dmarcato; B -2500.00 -5500.03 2500.00 0.00 ; +C 38; N scripts-open; B -2000.00 -2500.00 2000.00 2500.00 ; +C 39; N scripts-stopped; B -2750.02 -2750.02 2750.02 2750.02 ; +C 40; N scripts-upbow; B -3250.02 0.00 3250.02 10400.07 ; +C 41; N scripts-downbow; B -3750.00 0.00 3750.00 6666.64 ; +C 42; N scripts-reverseturn; B -5468.75 -2647.06 5468.75 2647.06 ; +C 43; N scripts-turn; B -5468.75 -2647.06 5468.75 2647.06 ; +C 44; N scripts-trill; B -5000.00 0.00 5000.00 11250.00 ; +C 45; N scripts-upedalheel; B -2500.00 -2500.00 2500.00 3333.33 ; +C 46; N scripts-dpedalheel; B -2500.00 -3333.33 2500.00 2500.00 ; +C 47; N scripts-upedaltoe; B -2500.00 0.00 2500.00 7500.00 ; +C 48; N scripts-dpedaltoe; B -2500.00 -7500.00 2500.00 0.00 ; +C 49; N scripts-flageolet; B -2666.67 -2666.67 2666.67 2666.67 ; +C 50; N scripts-trilelement; B -3333.33 -2500.00 1306.64 2500.00 ; +C 51; N scripts-prall; B -5653.30 -2500.00 5653.30 2500.00 ; +C 52; N scripts-mordent; B -5653.30 -2500.00 5653.30 2500.00 ; +C 53; N scripts-prallprall; B -7973.28 -2500.00 7973.28 2500.00 ; +C 54; N scripts-prallmordent; B -7973.28 -2500.00 7973.28 2500.00 ; +C 55; N scripts-upprall; B -7973.28 -2500.00 7973.28 2500.00 ; +C 56; N scripts-downprall; B -7973.28 -2500.00 7973.28 2500.00 ; +C 57; N flags-u3; B -250.02 -15325.03 6169.62 250.02 ; +C 58; N flags-u4; B -250.02 -17825.03 6169.62 250.02 ; +C 59; N flags-u5; B -250.02 -21575.03 6169.62 250.02 ; +C 60; N flags-u6; B -250.02 -26575.03 6169.62 250.02 ; +C 61; N flags-d3; B -250.02 -250.02 6827.44 14575.06 ; +C 62; N flags-d4; B -250.02 -250.02 6827.44 15325.03 ; +C 63; N flags-d5; B -250.02 -250.02 6827.44 19575.06 ; +C 64; N flags-d6; B -250.02 -250.02 6827.44 22075.06 ; +C 65; N clefs-alto; B -5000.00 -10000.00 18611.10 10000.00 ; +C 66; N clefs-alto_change; B -4000.02 -8000.03 14888.92 8000.03 ; +C 67; N clefs-bass; B -2500.00 -12500.00 18000.03 5000.00 ; +C 68; N clefs-bass_change; B -2000.05 -10000.05 14400.04 4000.02 ; +C 69; N clefs-violin; B -4357.15 -15000.00 18685.68 25000.00 ; +C 70; N clefs-violin_change; B -3785.74 -12000.05 14648.60 20000.08 ; +EndCharMetrics +EndFontMetrics diff --git a/mf/out/feta23.afm b/mf/out/feta23.afm new file mode 100644 index 0000000000..54d662faf9 --- /dev/null +++ b/mf/out/feta23.afm @@ -0,0 +1,76 @@ +FontName feta +StartFontMetrics +StartCharMetrics +C 0; N rests-0; B 0.00 -3515.63 8437.50 0.00 ; +C 1; N rests-1; B 0.00 0.00 8437.50 3515.63 ; +C 2; N rests-0o; B -3515.63 -3515.63 11953.13 562.53 ; +C 3; N rests-1o; B -3515.63 -562.53 11953.13 3515.63 ; +C 4; N rests--1; B 0.00 0.00 3375.00 5625.00 ; +C 5; N rests--2; B 0.00 -5625.00 3375.00 5625.00 ; +C 6; N rests-2; B 0.00 4218.75 6075.01 20250.03 ; +C 7; N rests-3; B 0.00 5625.00 7499.97 15984.47 ; +C 8; N rests-4; B 0.00 0.00 8726.58 15984.47 ; +C 9; N rests-5; B 0.00 0.00 9846.77 21609.47 ; +C 10; N rests-6; B 0.00 0.00 10558.03 27234.47 ; +C 11; N rests-7; B 0.00 0.00 11753.70 32859.47 ; +C 12; N accidentals-1; B 0.00 -8437.50 6187.53 8437.50 ; +C 13; N accidentals-0; B 0.00 -8437.50 3750.00 8437.50 ; +C 14; N accidentals--1; B -675.03 -2812.50 4500.02 11250.00 ; +C 15; N accidentals--2; B -675.03 -2812.50 8156.23 11250.00 ; +C 16; N accidentals-2; B 0.00 -2812.50 5625.00 2812.50 ; +C 17; N dots-dot; B 0.00 -1265.63 2531.23 1265.63 ; +C 18; N dots-repeatcolon; B 0.00 -2812.50 2531.23 2812.50 ; +C 19; N balls--1; B 0.00 -3093.77 11250.00 3093.77 ; +C 20; N balls--1l; B -2812.50 -562.53 14062.50 562.53 ; +C 21; N balls--2; B 0.00 -3093.77 11250.00 3093.77 ; +C 22; N balls--2l; B -2812.50 -562.53 14062.50 562.53 ; +C 23; N balls-0; B 0.00 -3093.77 11137.57 3093.77 ; +C 24; N balls-0l; B -2784.40 -562.53 13921.97 562.53 ; +C 25; N balls-1; B 0.00 -3093.77 7748.26 3093.77 ; +C 26; N balls-1l; B -1937.07 -562.53 9685.33 562.53 ; +C 27; N balls-2; B 0.00 -3093.77 7430.80 3093.77 ; +C 28; N balls-2l; B -1857.70 -562.53 9288.50 562.53 ; +C 29; N scripts-ufermata; B -7453.16 -421.90 7453.16 8156.31 ; +C 30; N scripts-dfermata; B -7453.16 -8156.31 7453.16 421.90 ; +C 31; N scripts-sforzato; B -5062.47 -2812.50 5062.47 2812.50 ; +C 32; N scripts-staccato; B -843.80 -843.80 843.80 843.80 ; +C 33; N scripts-ustaccatissimo; B -1125.06 -200.00 1125.06 5625.08 ; +C 34; N scripts-dstaccatissimo; B -1125.06 -5625.08 1125.06 200.00 ; +C 35; N scripts-tenuto; B -3375.03 -393.77 3375.03 393.77 ; +C 36; N scripts-umarcato; B -2812.50 0.00 2812.50 6187.53 ; +C 37; N scripts-dmarcato; B -2812.50 -6187.53 2812.50 0.00 ; +C 38; N scripts-open; B -2250.00 -2812.50 2250.00 2812.50 ; +C 39; N scripts-stopped; B -3093.77 -3093.77 3093.77 3093.77 ; +C 40; N scripts-upbow; B -3656.27 0.00 3656.27 11700.07 ; +C 41; N scripts-downbow; B -4218.75 0.00 4218.75 7499.97 ; +C 42; N scripts-reverseturn; B -6152.34 -2977.94 6152.34 2977.94 ; +C 43; N scripts-turn; B -6152.34 -2977.94 6152.34 2977.94 ; +C 44; N scripts-trill; B -5625.00 0.00 5625.00 12656.25 ; +C 45; N scripts-upedalheel; B -2812.50 -2812.50 2812.50 3750.00 ; +C 46; N scripts-dpedalheel; B -2812.50 -3750.00 2812.50 2812.50 ; +C 47; N scripts-upedaltoe; B -2812.50 0.00 2812.50 8437.50 ; +C 48; N scripts-dpedaltoe; B -2812.50 -8437.50 2812.50 0.00 ; +C 49; N scripts-flageolet; B -3000.00 -3000.00 3000.00 3000.00 ; +C 50; N scripts-trilelement; B -3750.00 -2812.50 1469.97 2812.50 ; +C 51; N scripts-prall; B -6359.99 -2812.50 6359.99 2812.50 ; +C 52; N scripts-mordent; B -6359.99 -2812.50 6359.99 2812.50 ; +C 53; N scripts-prallprall; B -8969.97 -2812.50 8969.97 2812.50 ; +C 54; N scripts-prallmordent; B -8969.97 -2812.50 8969.97 2812.50 ; +C 55; N scripts-upprall; B -8969.97 -2812.50 8969.97 2812.50 ; +C 56; N scripts-downprall; B -8969.97 -2812.50 8969.97 2812.50 ; +C 57; N flags-u3; B -281.27 -17240.65 6940.84 281.27 ; +C 58; N flags-u4; B -281.27 -20053.15 6940.84 281.27 ; +C 59; N flags-u5; B -281.27 -24271.90 6940.84 281.27 ; +C 60; N flags-u6; B -281.27 -29896.90 6940.84 281.27 ; +C 61; N flags-d3; B -281.27 -281.27 7680.88 16396.93 ; +C 62; N flags-d4; B -281.27 -281.27 7680.88 17240.65 ; +C 63; N flags-d5; B -281.27 -281.27 7680.88 22021.93 ; +C 64; N flags-d6; B -281.27 -281.27 7680.88 24834.43 ; +C 65; N clefs-alto; B -5625.00 -11250.00 20937.50 11250.00 ; +C 66; N clefs-alto_change; B -4500.02 -9000.03 16750.08 9000.03 ; +C 67; N clefs-bass; B -2812.50 -14062.50 20250.03 5625.00 ; +C 68; N clefs-bass_change; B -2250.05 -11250.05 16200.04 4500.02 ; +C 69; N clefs-violin; B -4901.80 -16875.00 21021.40 28125.00 ; +C 70; N clefs-violin_change; B -4258.94 -13500.05 16479.68 22500.08 ; +EndCharMetrics +EndFontMetrics diff --git a/mf/out/feta26.afm b/mf/out/feta26.afm new file mode 100644 index 0000000000..dc5c64e84c --- /dev/null +++ b/mf/out/feta26.afm @@ -0,0 +1,76 @@ +FontName feta +StartFontMetrics +StartCharMetrics +C 0; N rests-0; B 0.00 -4062.50 9750.00 0.00 ; +C 1; N rests-1; B 0.00 0.00 9750.00 4062.50 ; +C 2; N rests-0o; B -4062.50 -4062.50 13812.50 650.04 ; +C 3; N rests-1o; B -4062.50 -650.04 13812.50 4062.50 ; +C 4; N rests--1; B 0.00 0.00 3900.00 6500.00 ; +C 5; N rests--2; B 0.00 -6500.00 3900.00 6500.00 ; +C 6; N rests-2; B 0.00 4875.00 7020.02 23400.04 ; +C 7; N rests-3; B 0.00 6500.00 8666.64 18470.95 ; +C 8; N rests-4; B 0.00 0.00 10084.06 18470.95 ; +C 9; N rests-5; B 0.00 0.00 11378.50 24970.95 ; +C 10; N rests-6; B 0.00 0.00 12200.41 31470.95 ; +C 11; N rests-7; B 0.00 0.00 13582.05 37970.95 ; +C 12; N accidentals-1; B 0.00 -9750.00 7150.04 9750.00 ; +C 13; N accidentals-0; B 0.00 -9750.00 4333.33 9750.00 ; +C 14; N accidentals--1; B -780.04 -3250.00 5200.03 13000.00 ; +C 15; N accidentals--2; B -780.04 -3250.00 9424.99 13000.00 ; +C 16; N accidentals-2; B 0.00 -3250.00 6500.00 3250.00 ; +C 17; N dots-dot; B 0.00 -1462.50 2924.99 1462.50 ; +C 18; N dots-repeatcolon; B 0.00 -3250.00 2924.99 3250.00 ; +C 19; N balls--1; B 0.00 -3575.03 13000.00 3575.03 ; +C 20; N balls--1l; B -3250.00 -650.04 16250.00 650.04 ; +C 21; N balls--2; B 0.00 -3575.03 13000.00 3575.03 ; +C 22; N balls--2l; B -3250.00 -650.04 16250.00 650.04 ; +C 23; N balls-0; B 0.00 -3575.03 12870.12 3575.03 ; +C 24; N balls-0l; B -3217.53 -650.04 16087.65 650.04 ; +C 25; N balls-1; B 0.00 -3575.03 8953.54 3575.03 ; +C 26; N balls-1l; B -2238.39 -650.04 11191.93 650.04 ; +C 27; N balls-2; B 0.00 -3575.03 8586.67 3575.03 ; +C 28; N balls-2l; B -2146.67 -650.04 10733.34 650.04 ; +C 29; N scripts-ufermata; B -8612.53 -487.53 8612.53 9425.08 ; +C 30; N scripts-dfermata; B -8612.53 -9425.08 8612.53 487.53 ; +C 31; N scripts-sforzato; B -5849.96 -3250.00 5849.96 3250.00 ; +C 32; N scripts-staccato; B -975.07 -975.07 975.07 975.07 ; +C 33; N scripts-ustaccatissimo; B -1300.08 -200.00 1300.08 6500.10 ; +C 34; N scripts-dstaccatissimo; B -1300.08 -6500.10 1300.08 200.00 ; +C 35; N scripts-tenuto; B -3900.04 -455.03 3900.04 455.03 ; +C 36; N scripts-umarcato; B -3250.00 0.00 3250.00 7150.04 ; +C 37; N scripts-dmarcato; B -3250.00 -7150.04 3250.00 0.00 ; +C 38; N scripts-open; B -2600.00 -3250.00 2600.00 3250.00 ; +C 39; N scripts-stopped; B -3575.03 -3575.03 3575.03 3575.03 ; +C 40; N scripts-upbow; B -4225.02 0.00 4225.02 13520.10 ; +C 41; N scripts-downbow; B -4875.00 0.00 4875.00 8666.64 ; +C 42; N scripts-reverseturn; B -7109.38 -3441.18 7109.38 3441.18 ; +C 43; N scripts-turn; B -7109.38 -3441.18 7109.38 3441.18 ; +C 44; N scripts-trill; B -6500.00 0.00 6500.00 14625.00 ; +C 45; N scripts-upedalheel; B -3250.00 -3250.00 3250.00 4333.33 ; +C 46; N scripts-dpedalheel; B -3250.00 -4333.33 3250.00 3250.00 ; +C 47; N scripts-upedaltoe; B -3250.00 0.00 3250.00 9750.00 ; +C 48; N scripts-dpedaltoe; B -3250.00 -9750.00 3250.00 0.00 ; +C 49; N scripts-flageolet; B -3466.67 -3466.67 3466.67 3466.67 ; +C 50; N scripts-trilelement; B -4333.33 -3250.00 1698.62 3250.00 ; +C 51; N scripts-prall; B -7349.30 -3250.00 7349.30 3250.00 ; +C 52; N scripts-mordent; B -7349.30 -3250.00 7349.30 3250.00 ; +C 53; N scripts-prallprall; B -10365.28 -3250.00 10365.28 3250.00 ; +C 54; N scripts-prallmordent; B -10365.28 -3250.00 10365.28 3250.00 ; +C 55; N scripts-upprall; B -10365.28 -3250.00 10365.28 3250.00 ; +C 56; N scripts-downprall; B -10365.28 -3250.00 10365.28 3250.00 ; +C 57; N flags-u3; B -325.03 -19922.53 8020.51 325.03 ; +C 58; N flags-u4; B -325.03 -23172.53 8020.51 325.03 ; +C 59; N flags-u5; B -325.03 -28047.53 8020.51 325.03 ; +C 60; N flags-u6; B -325.03 -34547.53 8020.51 325.03 ; +C 61; N flags-d3; B -325.03 -325.03 8875.67 18947.57 ; +C 62; N flags-d4; B -325.03 -325.03 8875.67 19922.53 ; +C 63; N flags-d5; B -325.03 -325.03 8875.67 25447.57 ; +C 64; N flags-d6; B -325.03 -325.03 8875.67 28697.57 ; +C 65; N clefs-alto; B -6500.00 -13000.00 24194.44 13000.00 ; +C 66; N clefs-alto_change; B -5200.03 -10400.05 19355.70 10400.05 ; +C 67; N clefs-bass; B -3250.00 -16250.00 23400.04 6500.00 ; +C 68; N clefs-bass_change; B -2600.07 -13000.08 18720.08 5200.03 ; +C 69; N clefs-violin; B -5664.29 -19500.00 24291.40 32500.00 ; +C 70; N clefs-violin_change; B -4921.46 -15600.08 19043.21 26000.14 ; +EndCharMetrics +EndFontMetrics diff --git a/mutopia/J.S.Bach/Solo-Cello-Suites/allemande-alto.ly b/mutopia/J.S.Bach/Solo-Cello-Suites/allemande-alto.ly deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/mutopia/J.S.Bach/Solo-Cello-Suites/courante-alto.ly b/mutopia/J.S.Bach/Solo-Cello-Suites/courante-alto.ly deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/mutopia/J.S.Bach/Solo-Cello-Suites/gigue-alto.ly b/mutopia/J.S.Bach/Solo-Cello-Suites/gigue-alto.ly deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/mutopia/J.S.Bach/Solo-Cello-Suites/menuetto-alto.ly b/mutopia/J.S.Bach/Solo-Cello-Suites/menuetto-alto.ly deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/mutopia/J.S.Bach/Solo-Cello-Suites/prelude-alto.ly b/mutopia/J.S.Bach/Solo-Cello-Suites/prelude-alto.ly deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/mutopia/J.S.Bach/Solo-Cello-Suites/sarabande-alto.ly b/mutopia/J.S.Bach/Solo-Cello-Suites/sarabande-alto.ly deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/mutopia/J.S.Bach/Solo-Cello-Suites/scsii-alto.ly b/mutopia/J.S.Bach/Solo-Cello-Suites/scsii-alto.ly deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/mutopia/standchen.ly b/mutopia/standchen.ly index 64f5e71d68..185e298a39 100644 --- a/mutopia/standchen.ly +++ b/mutopia/standchen.ly @@ -1,10 +1,10 @@ \header{ filename = "standchen.ly"; -title = "St\"andchen"; -subtitle = "(Serenade)\\\``Leise flehen meine Lieder"; +title = "St\\\"andchen"; +subtitle = "(Serenade)\\\\``Leise flehen meine Lieder''"; opus = "D. 957 No. 4"; -composer = "Franz Schubert (1797-1828)" - "Text by Ludwig Rellstab (1799-1860)"; +composer = "Franz Schubert (1797-1828)"; +poet= "Text by Ludwig Rellstab (1799-1860)"; enteredby = "JCN"; copyright = "public domain"; } @@ -20,9 +20,9 @@ $vocal_verse1 = \melodic\relative c{ % ugh: treble/bass % \clef treble; % \clef violin; - [/3 g''8( )as] g \] c4. g8 | - [/3 f8( )g] f \] c'4 f,8 r | - g4.-> f8 [/3 f( )es] d \] | + [/3 g''8( )as] g \]/1 c4. g8 | + [/3 f8( )g] f \]/1 c'4 f,8 r | + g4.-> f8 [/3 f( )es] d \]/1 | es2 r4 | % ugh: a whole should be a measure %r1 | @@ -84,7 +84,7 @@ $lyric_verse1 = \lyric{ _ _ _ | % 11 \[/3 In4 den8 \] stil-4. len8 | - \[/3 Hainr4 her-8 \] nie-4. der8 | + \[/3 Hain4 her-8 \] nie-4. der8 | Lieb4. chen8 \[/3 komm4 zu8 \] | mir!2 _4 | _4 _ _ | @@ -94,8 +94,8 @@ $lyric_verse1 = \lyric{ Wip-8. fel16 rau-4. schen8 | \[/3 In4 des8 \] Mon-4. des8 | Licht;2. | - _4 _ _ | - _4 _ _ | + \[/3 In4 des8 \] Mon-4. des8 | + Licht;2. | % 23 Des8. Ver-16 r\"a-4. ters8 | feind-8. lich16 Lau-4. schen8 | @@ -143,10 +143,12 @@ $lyric_through = \lyric{ % 37 La\ss8. auch16 dir8. die16 Brust8. be-16 | we-4 gen _ | - Lieb-4. chen8 h\"o-8. re16 | + Lieb-4. chen,8 h\"o-8. re16 | mich!2 _4 | - Be-8. bend16 harr4 ich8 _8 | + Be-4. bend8 \[/3 harr'4 ich8\]/1 | dir8. ent-16 ge-4 gen!8 _8 | + _2. | + _2. | \[/3 Komm4 be-8 \] gl\"u4. cke8 | mich!2. | \[/3 Komm4 be-8 \] gl\"u4. cke8 | @@ -198,7 +200,7 @@ $treble_verse1 = \melodic\relative c{ r8 <[e g> <g c> <e g> <g c> <e g]> | r8 <[f a c> <a c f> <f a c> <a c f> <f a c]> | r8 <[e g c> <g c e> <e g c> <g c e> <e g c]> | - <{[/3 f8\f( e f]1/1 a4. )f8 } {\[/3 f' e f \] a4. f8 } > | + <{[/3 f8\f( e f]1/1 a4. )f8 } {\[/3 f' e f \]/1 a4. f8 } > | <e2 e'> r4 | } @@ -243,7 +245,7 @@ $treble_through = \melodic\relative c{ r8 <[f,\p a c> <a c f> <f a c> <a c f> <f a c]> | %70 r8 <[e g c> <g c e> <e g c> <g c e> <e g c]> | - <{[/3 f8\f( e f]1/1 a4. )f8 } {\[/3 f' e f \] a4. f8 } > | + <{[/3 f8\f( e f]1/1 a4. )f8 } {\[/3 f' e f \]/1 a4. f8 } > | <e'2 e'> r4 | <es2 es'> r4 | <d2 d'> r4 | @@ -328,8 +330,8 @@ $bass_through = \melodic\relative c{ <g8 g'> <[d'' g> <g b> <d g> <g b> <d g]> | c,8 <[c' e g> <e g c> <c e g> <e g c> <c e g]> | - <c,8 c'> <[c' es! g> <es g c> <c es! g> <es g c> <c es! g]> | - <f,,8 f'> <[d'' f> <f as!> <d f> <f as!> <d f]> | + <c,8 c'> <[c' es! g> <es g c> <c es g> <es g c> <c es g]> | + <f,,8 f'> <[d'' f> <f as!> <d f> <f as> <d f]> | %75 <g,,8 g'> <[d'' f> <f g> <d f> <f g> <d f]> | c,8 <[c' e> <e g> <c e> <e g> <c e]> | @@ -422,10 +424,13 @@ $grand_staff = \type GrandStaff< > \score{ + % Transpose as you like for your voice + % Range untransposed is c' to f'' (for tenors and sopranos) + % \transpose a gives a' to d'' < - \$vocal_staff + { \melodic \transpose a { \$vocal_staff } } \$lyric_staff - \$grand_staff + { \melodic \transpose a { \$grand_staff } } > \include "score-paper.ly"; \midi{ diff --git a/scripts/convert-mudela.py b/scripts/convert-mudela.py index 4872dd69f9..d5a78f9a0b 100644 --- a/scripts/convert-mudela.py +++ b/scripts/convert-mudela.py @@ -33,7 +33,7 @@ def program_id (): return '%s version %s' %(program_name, version); def identify (): - sys.stdout.write (program_id () + '\n') + sys.stderr.write (program_id () + '\n') def gulp_file(f): try: diff --git a/scripts/ly2dvi.sh b/scripts/ly2dvi.sh index 31d86c250d..1af0885bd6 100644 --- a/scripts/ly2dvi.sh +++ b/scripts/ly2dvi.sh @@ -618,9 +618,6 @@ if [ "$SOURCEDIR" != "" ]; then export TEXINPUTS="$SOURCEDIR/tex:$TEXINPUTS:" export MFINPUTS="$SOURCEDIR/mf:$MFINPUTS:" export LILYPOND_EXECUTABLE="$SOURCEDIR/lily/out/lilypond" - - set|grep MF - set|grep TEXIN fi # diff --git a/scripts/mudela-book.py b/scripts/mudela-book.py index ce491b816e..6c4291c227 100644 --- a/scripts/mudela-book.py +++ b/scripts/mudela-book.py @@ -1,5 +1,4 @@ - -# python version of mudela-book. WIP. +#!@PYTHON@ # TODO: center option diff --git a/stepmake/aclocal.m4 b/stepmake/aclocal.m4 index 5f282f05b1..dbcb4d30d2 100644 --- a/stepmake/aclocal.m4 +++ b/stepmake/aclocal.m4 @@ -234,13 +234,16 @@ dnl fi LN=cp # hard link does not work under cygnus-nt (yet?) ZIP="zip -r -9" # DOTEXE=.exe + INSTALL="\$(stepdir)/../bin/install-dot-exe.sh -c" else LN=ln ZIP="zip -r -9" + INSTALL="\$(stepdir)/../bin/install-sh -c" fi AC_SUBST(DOTEXE) AC_SUBST(ZIP) AC_SUBST(LN) + AC_SUBST(INSTALL) AC_STEPMAKE_DATADIR ]) @@ -424,6 +427,9 @@ AC_DEFUN(AC_STEPMAKE_YODL, [ AC_SUBST(YODL2TXT) export YODL YODL2HTML YODL2LATEX YODL2MAN YODL2TEXINFO YODL2TXT fi + if test "x$YODL" = "-echo no yodl"; then + AC_STEPMAKE_WARN(Did not find YODL (Yodl is Yet Oneother Document Language, see http://www.cs.uu.nl/~hanwen/yodl)) + fi ]) dnl should cache result. diff --git a/stepmake/bin/fake-yodl.sh b/stepmake/bin/fake-yodl.sh index f28f6025e4..d865baa919 100644 --- a/stepmake/bin/fake-yodl.sh +++ b/stepmake/bin/fake-yodl.sh @@ -30,4 +30,5 @@ fi echo Faking Yodl: copying $1 to $OUTPUT -cp $1 $OUTPUT +echo THIS IS A SURROGATE. Please install YODL for a formatted document > $OUTPUT +cat $1 >> $OUTPUT diff --git a/stepmake/bin/package-diff.py b/stepmake/bin/package-diff.py index dfbbebc988..2e361e453d 100644 --- a/stepmake/bin/package-diff.py +++ b/stepmake/bin/package-diff.py @@ -54,7 +54,9 @@ def remove_automatic (dirnames): # urg, again? from flower import * files = files + multiple_find (pats, dirnames) - + dirs = multiple_find (['out'], dirnames) + for d in dirs: + files = files + multiple_find (['*'], [d]) for f in files: os.remove (f) @@ -86,7 +88,7 @@ def remove_configure (dir): # ugh, how to get rid of .tex files generated by lily? -pats = ['.dstreamrc', 'configure', '*.diff', '*.diff.gz', '*.lsm', '*.pyc', '*.spec', '*.txt'] +pats = ['configure', '*.diff', '*.diff.gz', '*.pyc', '*.txt'] header = 'Generated by %s using %s,\ \nFrom = %s, To = %s\n\ @@ -106,7 +108,7 @@ def makediff (fromdir, todir, patch_name): from packagepython import * remove_automatic ([fromdir, todir]) - + # ugh remove_configure (fromdir) remove_configure (todir) diff --git a/stepmake/config.make.in b/stepmake/config.make.in index 23f15f87a2..25bfe5945a 100644 --- a/stepmake/config.make.in +++ b/stepmake/config.make.in @@ -4,7 +4,6 @@ package-depth = @package_depth@ -INSTALL = @INSTALL@ USER_CXXFLAGS = @CXXFLAGS@ @CPPFLAGS@ USER_LDFLAGS = @@ -39,6 +38,7 @@ DEFS = @DEFS@ DEFINES = @DEFS@ @DEFINES@ COMPILEINFO = @COMPILEINFO@ DOTEXE = @DOTEXE@ +INSTALL = @INSTALL@ BASH = @BASH@ BISON = @BISON@ FIND = @FIND@ diff --git a/stepmake/configure b/stepmake/configure index d77a257f2a..ee022aefa9 100755 --- a/stepmake/configure +++ b/stepmake/configure @@ -860,13 +860,16 @@ fi LN=cp # hard link does not work under cygnus-nt (yet?) ZIP="zip -r -9" # DOTEXE=.exe + INSTALL="\$(stepdir)/../bin/install-dot-exe.sh -c" else LN=ln ZIP="zip -r -9" + INSTALL="\$(stepdir)/../bin/install-sh -c" fi + if test "$datadir" = "\${prefix}/share"; then @@ -923,7 +926,7 @@ fi echo $ac_n "checking language""... $ac_c" 1>&6 -echo "configure:927: checking language" >&5 +echo "configure:930: checking language" >&5 case "$language" in En* | en* | Am* | am* | US* | us*) lang=English;; @@ -955,7 +958,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:959: checking for $ac_word" >&5 +echo "configure:962: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YODL'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -989,7 +992,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:993: checking for $ac_word" >&5 +echo "configure:996: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YODL2HTML'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1023,7 +1026,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:1027: checking for $ac_word" >&5 +echo "configure:1030: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YODL2LATEX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1056,7 +1059,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:1060: checking for $ac_word" >&5 +echo "configure:1063: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YODL2MAN'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1090,7 +1093,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:1094: checking for $ac_word" >&5 +echo "configure:1097: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YODL2TEXINFO'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1124,7 +1127,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:1128: checking for $ac_word" >&5 +echo "configure:1131: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YODL2TXT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1162,6 +1165,12 @@ test -n "$YODL2TXT" || YODL2TXT="-echo no yodl" export YODL YODL2HTML YODL2LATEX YODL2MAN YODL2TEXINFO YODL2TXT fi + if test "x$YODL" = "-echo no yodl"; then + + echo "configure: warning: Did not find YODL (Yodl is Yet Oneother Document Language, see http://www.cs.uu.nl/~hanwen/yodl)" 1>&2 + warn_b=yes + + fi # AM_PATH_GTK(1.0.0,,AC_MSG_ERROR([please install proper version of gtk])) @@ -1172,7 +1181,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:1176: checking for $ac_word" >&5 +echo "configure:1185: 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 @@ -1356,6 +1365,7 @@ s%@PYTHON@%$PYTHON%g s%@DOTEXE@%$DOTEXE%g s%@ZIP@%$ZIP%g s%@LN@%$LN%g +s%@INSTALL@%$INSTALL%g s%@DIR_DATADIR@%$DIR_DATADIR%g s%@YODL@%$YODL%g s%@YODL2HTML@%$YODL2HTML%g diff --git a/stepmake/stepmake/Documentation.shared.make b/stepmake/stepmake/Documentation.shared.make index 1a8ee9b02a..1a29861d79 100644 --- a/stepmake/stepmake/Documentation.shared.make +++ b/stepmake/stepmake/Documentation.shared.make @@ -39,7 +39,7 @@ $(outdir)/$(package).info: check-texinfo-deps $(OUTTEXINFO_FILES) $(MAKEINFO) -o $@ $(outdir)/topinfo.texinfo localinstall: # $(INFO_FILES) - $(INSTALL) -d $(infodir) + -$(INSTALL) -d $(infodir) $(INFOINSTALL) localuninstall: $(INFOINSTALL) diff --git a/stepmake/stepmake/Executable.make b/stepmake/stepmake/Executable.make index 1516ad7eb7..3feadc553a 100644 --- a/stepmake/stepmake/Executable.make +++ b/stepmake/stepmake/Executable.make @@ -18,9 +18,9 @@ localinstall: installexe localuninstall: uninstallexe installexe: all - $(INSTALL) -d $(bindir) + -$(INSTALL) -d $(bindir) $(foreach a, $(EXECUTABLES), \ - $(INSTALL) -m 755 $(outdir)/$(a) $(bindir)/$(a)$(DOTEXE) && \ + $(INSTALL) -m 755 $(outdir)/$(a)$(DOTEXE) $(bindir)/$(a)$(DOTEXE) && \ strip $(bindir)/$(a)$(DOTEXE) && ) true $(foreach a, $(SEXECUTABLES), \ $(INSTALL) -m 755 $(outdir)/$(a) $(bindir) &&) true diff --git a/stepmake/stepmake/Install_outfiles.make b/stepmake/stepmake/Install_outfiles.make index 53b2321dc7..b4f2539f8c 100644 --- a/stepmake/stepmake/Install_outfiles.make +++ b/stepmake/stepmake/Install_outfiles.make @@ -3,7 +3,7 @@ localinstall: localinstall-files localinstall-files: $(INSTALLATION_OUT_FILES) - $(INSTALL) -d $(INSTALLATION_OUT_DIR) + -$(INSTALL) -d $(INSTALLATION_OUT_DIR) $(foreach i, $(INSTALLATION_OUT_FILES), \ $(INSTALL) -m 644 $(i) $(INSTALLATION_OUT_DIR) && )true diff --git a/stepmake/stepmake/Installfiles.make b/stepmake/stepmake/Installfiles.make index 96b8ee76b1..58d10e30cf 100644 --- a/stepmake/stepmake/Installfiles.make +++ b/stepmake/stepmake/Installfiles.make @@ -3,7 +3,7 @@ localinstall: localinstall-files localinstall-files: - $(INSTALL) -d $(INSTALLATION_DIR) + -$(INSTALL) -d $(INSTALLATION_DIR) $(foreach i, $(INSTALLATION_FILES),\ $(INSTALL) -m 644 $(i) $(INSTALLATION_DIR) &&)true diff --git a/stepmake/stepmake/Manual.make b/stepmake/stepmake/Manual.make index 5186b1d8cd..0e6206dabf 100644 --- a/stepmake/stepmake/Manual.make +++ b/stepmake/stepmake/Manual.make @@ -3,7 +3,7 @@ MANGROFF = $(addprefix $(outdir)/, $(addsuffix .$(SECTION))) localinstall: $(MANGROFFS) - $(INSTALL) -d $(mandir)/man$(SECTION) + -$(INSTALL) -d $(mandir)/man$(SECTION) $(INSTALL) -m 644 $(MANGROFFS) $(mandir)/man$(SECTION) diff --git a/stepmake/stepmake/Po.make b/stepmake/stepmake/Po.make new file mode 100644 index 0000000000..c5e22d1f29 --- /dev/null +++ b/stepmake/stepmake/Po.make @@ -0,0 +1,35 @@ + + +#### +#### UGH! +new-po: + if test -r $(po-dir); then \ + rm -f $(po-dir)/$(outdir)/$(package).po; \ + touch $(po-dir)/$(outdir)/$(package).po; \ + fi + +ifeq ($(strip $(depth)),.) +po: new-po + $(LOOP) +localpo: + @true +else +po: localpo + $(LOOP) +ALL_PO_SOURCES = $(ALL_C_SOURCES) $(wildcard $(outdir)/*.hh) $(wildcard $(outdir)/*.cc) +localpo: +ifneq ($(strip $(ALL_PO_SOURCES)),) + @echo $(ALL_PO_SOURCES) + xgettext --c++ --default-domain=$(package) --join \ + --output-dir=$(po-dir)/$(outdir) --add-comments \ + --keyword=_ --keyword=_f $(ALL_PO_SOURCES) +endif +endif + + +po-update: po + $(MAKE) -C $(po-dir) po-update + +show-po-changes: + $(MAKE) -C $(po-dir) show-po-changes + diff --git a/stepmake/stepmake/Targets.make b/stepmake/stepmake/Targets.make index 43d9877f18..ed386b70e8 100644 --- a/stepmake/stepmake/Targets.make +++ b/stepmake/stepmake/Targets.make @@ -24,35 +24,8 @@ maintainerclean: $(MAKE) local-maintainerclean $(MAKE) local-distclean -new-po: - if test -r $(po-dir); then \ - rm -f $(po-dir)/$(outdir)/$(package).po; \ - touch $(po-dir)/$(outdir)/$(package).po; \ - fi +include $(stepdir)/Po.make -ifeq ($(strip $(depth)),.) -po: new-po - $(LOOP) -localpo: - @true -else -po: localpo - $(LOOP) -ALL_PO_SOURCES = $(ALL_C_SOURCES) $(wildcard $(outdir)/*.hh) $(wildcard $(outdir)/*.cc) -localpo: -ifneq ($(strip $(ALL_PO_SOURCES)),) - @echo $(ALL_PO_SOURCES) - xgettext --c++ --default-domain=$(package) --join \ - --output-dir=$(po-dir)/$(outdir) --add-comments \ - --keyword=_ --keyword=_f $(ALL_PO_SOURCES) -endif -endif - -po-update: po - $(MAKE) -C $(po-dir) po-update - -show-po-changes: - $(MAKE) -C $(po-dir) show-po-changes # configure: # @@ -120,7 +93,8 @@ check-state-vector: fi -localdist: $(DIST_FILES) $(OUT_DIST_FILES) $(NON_ESSENTIAL_DIST_FILES) +local-dist: $(DIST_FILES) $(OUT_DIST_FILES) $(NON_ESSENTIAL_DIST_FILES) + mkdir $(distdir)/$(localdir) $(LN) $(DIST_FILES) $(distdir)/$(localdir) #UGH UGH . make ifdef doesn't mix with string substitution semantics (late expansion vs. early expansion) @@ -132,8 +106,7 @@ localdist: $(DIST_FILES) $(OUT_DIST_FILES) $(NON_ESSENTIAL_DIST_FILES) mkdir $(distdir)/$(localdir)/out; \ $(LN) $(OUT_DIST_FILES) $(distdir)/$(localdir)/out; \ fi - $(foreach i, $(SUBDIRS), mkdir $(distdir)/$(localdir)/$(i); \ - $(MAKE) distdir=../$(distdir) localdir=$(localdir)/$(i) -C $(i) localdist &&) true + $(foreach i, $(SUBDIRS), $(MAKE) distdir=../$(distdir) localdir=$(localdir)/$(i) -C $(i) local-dist &&) true @@ -176,7 +149,7 @@ uninstall: localuninstall localuninstall: installextradoc: - $(INSTALL) -d $(prefix)/doc/$(package) + -$(INSTALL) -d $(prefix)/doc/$(package) $(foreach i, $(EXTRA_DOC_FILES),\ cp -r $(i) $(prefix)/doc/$(package) &&) true @@ -192,3 +165,8 @@ $(outdir)/dummy.dep: -mkdir $(outdir) touch $(outdir)/dummy.dep + +check: local-check + $(LOOP) + +local-check: diff --git a/stepmake/stepmake/Toplevel.make b/stepmake/stepmake/Toplevel.make index 52d1256221..00ae42bf77 100644 --- a/stepmake/stepmake/Toplevel.make +++ b/stepmake/stepmake/Toplevel.make @@ -7,7 +7,7 @@ DIST_FILES := $(EXTRA_DIST_FILES) # -localdist: configure +local-dist: configure local-distclean: rm -f config.hh config.make Makefile config.cache \ @@ -46,8 +46,7 @@ WWW-clean: dist: check-state-vector rm -rf $(distdir) - -mkdir $(distdir) - $(MAKE) localdist $(distdir) + $(MAKE) local-dist $(distdir) chmod -R a+r $(distdir) chmod a+x `find $(distdir) -type d -print` (cd ./$(depth)/$(outdir); $(TAR) cf - $(DIST_NAME) | gzip -9 > $(DIST_NAME).tar.gz) diff --git a/stepmake/stepmake/Variables.make b/stepmake/stepmake/Variables.make index 59e84b210a..16b227db45 100644 --- a/stepmake/stepmake/Variables.make +++ b/stepmake/stepmake/Variables.make @@ -43,8 +43,8 @@ doc-dir = $(depth)/Documentation make-dir = $(depth)/make po-dir = $(depth)/po -# -c is for copying -INSTALL = $(stepdir)/../bin/install-sh -c +# -c is for copying (now set in config.make) +# INSTALL = $(stepdir)/../bin/install-sh -c # user settings: #