-TITLE INFORMATION: AUTHORS - who did what on GNU LilyPond?
-
-Contents
-
-This file lists authors of GNU LilyPond, and what they wrote. This
-list is alphabetically ordered.
-
-o Tom Cato Amundsen <tomcato@xoommail.com>,
- cembalo-partita in mudela, accordion symbols, some mudela-book.py
-o Mats Bengtsson <matsb@s3.kth.se>,
- http://www.s3.kth.se/~matsb/
- lots of testing, fixes, general comments and contributions.
-o Eric Bullinger <eric@aut.ee.ethz.ch>,
- accidental transposition.
-o Jan Arne Fagertun <Jan.A.Fagertun@energy.sintef.no>,
- TeX titling and lytodvi.sh
-o Anthony Fok <foka@debian.org>,
- debian package: debian/*
-o Bjoern Jacke <bjoern.jacke@gmx.de>
- german glossary stuff.
-o Neil Jerram <nj104@cus.cam.ac.uk>.
- 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 Michael Krause <m.krause@tu-harburg.de>,
- breathing signs
-o Werner Lemberg <xlwy01@uxp1.hrz.uni-dortmund.de>,
- misc bugfixes, some Beam and Stem code.
-o David R. Linn <drl@vuse.vanderbilt.edu>,
- Mailing list maintenance.
-o Adrian Mariano <>
- Reference manual, tutorial fixes, glossary.
-o Han-Wen Nienhuys <hanwen@cs.uu.nl>,
- http://www.cs.uu.nl/~hanwen/
- Main author (initials: HWN).
-o Jan Nieuwenhuizen <janneke@gnu.org>,
- http://www.xs4all.nl/~jantien/
- Main author (initials: JCN).
-o Alexandre Oliva <oliva@dcc.unicamp.br>,
- http://sunsite.unicamp.br/~oliva/
- testing
-o Franc,ois Pinard <pinard@iro.umontreal.ca>,
- parts of Documentation/Vocab*, started internationalization stuff
-o Glen Prideaux <glenprideaux@iname.com>,
- minor bug fix to script used to generate doc++ documentation
-o Jeffrey B. Reed <daboys@austin.rr.com>,
- Windows-NT support.
-o Shay Rojanski
- Some mudela source.
-
-Your name could be here! If you want to fix something, do it, and send
-us a patch!
+ AUTHORS - who did what on GNU LilyPond?
+
+Contents
+
+This file lists authors of GNU LilyPond, and what they
+wrote. This list is alphabetically ordered.
+
+o Tom Cato Amundsen <tomcato@xoommail.com>, cembalo-par-
+ tita in mudela, accordion symbols, some mudela-book.py
+
+o Mats Bengtsson <matsb@s3.kth.se>,
+ http://www.s3.kth.se/~matsb/ lots of testing, fixes,
+ general comments and contributions.
+
+o Eric Bullinger <eric@aut.ee.ethz.ch>, accidental trans-
+ position.
+
+o Jan Arne Fagertun <Jan.A.Fagertun@energy.sintef.no>,
+ TeX titling and lytodvi.sh
+
+o Anthony Fok <foka@debian.org>, debian package: debian/*
+
+o Bjoern Jacke <bjoern.jacke@gmx.de> german glossary
+ stuff.
+
+o Neil Jerram <nj104@cus.cam.ac.uk>. parts of Documenta-
+ tion/Vocab*
+
+o Donald Ervin Knuth, http://www-cs-staff.stan-
+ ford.edu/~knuth/ mf/ital-*.mf (these were taken from
+ the CM fonts)
+
+o Michael Krause <m.krause@tu-harburg.de>, breathing
+ signs
+
+o Werner Lemberg <xlwy01@uxp1.hrz.uni-dortmund.de>, misc
+ bugfixes, some Beam and Stem code.
+
+o David R. Linn <drl@vuse.vanderbilt.edu>, Mailing list
+ maintenance.
+
+o Adrian Mariano <> Reference manual, tutorial fixes,
+ glossary.
+
+o Han-Wen Nienhuys <hanwen@cs.uu.nl>,
+ http://www.cs.uu.nl/~hanwen/ Main author (initials:
+ HWN).
+
+o Jan Nieuwenhuizen <janneke@gnu.org>,
+ http://www.xs4all.nl/~jantien/ Main author (initials:
+ JCN).
+
+o Alexandre Oliva <oliva@dcc.unicamp.br>, http://sun-
+ site.unicamp.br/~oliva/ testing
+
+o Franc,ois Pinard <pinard@iro.umontreal.ca>, parts of
+ Documentation/Vocab*, started internationalization
+
+ stuff
+
+o Glen Prideaux <glenprideaux@iname.com>, minor bug fix
+ to script used to generate doc++ documentation
+
+o Jeffrey B. Reed <daboys@austin.rr.com>, Windows-NT sup-
+ port.
+
+o Shay Rojanski Some mudela source.
+
+Your name could be here! If you want to fix something, do
+it, and send us a patch!
********
-[Linux ppc, egcs-1.0.2]
+[LinuxPPC-R5, egcs-1.1.2-12c]
-All compiling with -O2 is suspect, in particular guile-1.3, and
-Lily herself will break.
+Serious egcs-1.1.2-12c (stock LinuxPPC R5) bug on ppc:
+ *dest++ = *src++;
-[All platforms]
+Bug report filed, fixed in egcs-1.1.2-12f.
+Although we've currently got a workaround in place, the compiler
+is buggy; you should upgrade:
-When dealing with beaming that is not correct (eg quarter notes in
-beams.), you can get the following assert. This is a serious bug, but
-a good solution is quite a lot of work.
+ ftp://dev.linuxppc.org/users/fsirl/R5/RPMS/ppc/
- \score{
- \melodic{
- [c2 c]
- }
- }
-results in
+[LinuxPPC-R4, egcs-1.0.2]
+
+All compiling with -O2 is suspect, in particular guile-1.3, and
+Lily herself will break.
- lilypond: ../flower/include/varray.hh:141: struct Rhythmic_grouping *& Array<Rhythmic_grouping *>::elem(int) const: Assertion `i >=0&&i<size_' failed.
-And this
+[LinuxPPC, egcs-1.1b]
- \score{
- \melodic{
- [c]
- }
- }
+Lilypond 1.1.35-1.1.51,...: Wierd errors in guile scm_gc_mark ()
-in
- lilypond: ../flower/include/cursor.tcc:104: int Cursor<void *>::operator -(class Cursor<void *>) const: Assertion `c.ok()' failed.
- Aborted (core dumped)
+[All platforms]
+Some bugs may be captured in input/bugs/*y
[Linux libg++ 2.7]
.PP
.SH "DESCRIPTION"
.PP
-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, named chords, transposing, formatting scores,
-part extraction\&. It includes a nice font of musical symbols\&.
+LilyPond is the GNU Project music typesetter\&. It transforms a musical
+description file into beautiful sheet music\&.
+.PP
.PP
.SH "OPTIONS"
.IP "-I,--include="
.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
+Send it to bug-gnu-music@gnu\&.org (you don\'t have to subscribe
to this mailinglist)\&.
.PP
.SH "Remarks"
includefile(convert-mudela.yo)
includefile(lilypond.yo)
includefile(ly2dvi.yo)
-includefile(mi2mu.yo)
+includefile(midi2ly.yo)
includefile(mudela-book.yo)
)
\vskip5mm
-\listfont{\fetatwenty}{0}{102}
+\listfont{\fetatwenty}{0}{105}
% urg
\vskip-\charheight
\listfont{\fetanumber}{48}{58}
Grace notes are typeset as an encapsulated piece of music. You can
have beams, notes, chords, stems etc. within a \verb|\grace|
section. Slurs that start within a grace section, but aren't ended are
-attached to the next normal note. Grace notes have zero duration
+attached to the next normal note. Grace notes have zero duration. If
+there are tuplets, the grace notes won't be under the brace.
code(\rc) and code(\rced) go after the last note. Because these marks are
bound to notes, if you want to get several marks during one note, you must use
spacer notes.
-mudela(fragment,verbatim,center)(
+COMMENT(Broken
+m udela(fragment,verbatim,center)(
c'' \< \! c'' d'' \decr e'' \rced
< f''1 {s4 \< \! s4 \> \! s2 } >)
+)
COMMENT(Broken!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
Chords can be entered either by name or by listing the notes in angle brackets.
Chords can be displayed either as notes or by name. To enter chords by name,
-either place them inside the code(\chords) keyword, or use
-code(\notes) and surround them with
-code(@) characters.
+either place them inside the code(\chords) keyword.
Chord names have the form
var(tonic)[var(duration)][code(-)var(modifier)][code(^)var(subtractions)][code(/)var(inversion)]
The var(tonic) should be the tonic note of the chord, and the var(duration) is
code(-) to indicate raising or lowering by half a step. A chord additions has
two effects: it adds the specified interval and all lower odd numbered
intervals to the chord, and it may lower or raise the specified interval.
-Intervals can be separated by a dot (code(.)) if you need to list
-several unmodified intervals.
+Intervals must be separated by a dot (code(.)).
Repeating a code(-) character will remove a half step from the preceeding
interval.
mudela(fragment,verbatim,center)(
\transpose c''{
\chords{
c1 c-3- c-7 c-8 c-9
- c-9-5+7+ c-3-5- c-4.6.8
+ c-9-.5+.7+ c-3-.5- c-4.6.8
}})
The second type of modifier that may appear after the code(-) is
a named modifier.
specified note is not in the chord then a warning will be printed.
mudela(fragment,verbatim,center)(
\transpose c'''{
- @c1@ @c/e@ @c/g@ @c-7/e@
+ \chords { c1 c/e c/g c-7/e }
})
Throughout these examples, chords have been shifted around the staff
using code(\transpose). The code(\relative) keyword has odd effects
description(
dit(code(C)) 4/4 and 2/2 are typeset as C and struck C,
respectively. All other time signatures are written with two digits.
- dit(code(old)) 2/2, 3/2, 3/4, 4/4, 6/4, 9/4, 6/8 and 9/8 are typeset
- with old-style mensuration marks. All other time signatures are
- written with two digits.
+ dit(code(old)) 2/2, 3/2, 2/4, 3/4, 4/4, 6/4, 9/4, 4/8, 6/8 and
+ 9/8 are typeset with old-style mensuration marks. All other time
+ signatures are written with two digits.
dit(code(1)) All time signatures are typeset with a single
digit, e.g. 3/2 is written as 3.
dit(code(C2/2), code(C4/4), code(old2/2), code(old3/2),
- code(old3/4), code(old4/4), code(old6/4), code(old9/4),
- code(old6/8) or code(old9/8))Tells Lilypond to use a
- specific symbol as time signature.
+ code(old2/4), code(old3/4), code(old4/4), code(old6/4),
+ code(old9/4), code(old4/8), code(old6/8), code(old6/8alt)
+ or code(old9/8))Tells Lilypond to use a specific symbol as
+ time signature.
)
The different time signature characters are shown below with
their names:
\time 2/2; a2^"old2/2" a2
\property Staff.timeSignatureStyle = "old3/2"
\time 2/2; a2^"old3/2" a2
+\property Staff.timeSignatureStyle = "old2/4"
+\time 2/2; a2^"old2/4" a2
\property Staff.timeSignatureStyle = "old4/4"
\time 2/2; a2^"old4/4" a2
\property Staff.timeSignatureStyle = "old6/4"
\time 2/2; a2^"old6/4" a2
\property Staff.timeSignatureStyle = "old9/4"
\time 2/2; a2^"old9/4" a2
+\property Staff.timeSignatureStyle = "old4/8"
+\time 2/2; a2^"old4/8" a2
\property Staff.timeSignatureStyle = "old6/8"
\time 2/2; a2^"old6/8" a2
+\property Staff.timeSignatureStyle = "old6/8alt"
+\time 2/2; a2^"old6/8alt" a2
\property Staff.timeSignatureStyle = "old9/8"
\time 2/2; a2^"old9/8" a2
}
)
)
-The commands described above do not music that you could hear, but
-within the language, they are "Music": they are grammatically
+The commands described above do not give music that you could hear,
+but within the language, they are "Music": they are grammatically
equivalent to notes, so they can appear in the same places as notes.
sect(Notation context)
make pnmtopng
)
-You can then install the new pnmtopng into /usr/local/bin/
+You can then install the new pnmtopng into file(/usr/local/bin/)
it()Bib2html lurl(http://pertsserver.cs.uiuc.edu/~hull/bib2html.)
Which, in turn depends on man2html for proper installation.
man2html can be had from lurl(http://askdonald.ask.uni-karlsruhe.de/hppd/hpux/Networking/WWW/Man2html-1.05).
+The website will build without this utility, but you will not see our
+hypertextified bibliography.
+
TeTeX users should not forget to rerun texhash.
)
redef(article)(3)(chapter(ARG1))
redef(includefile)(1)(INCLUDEFILE(tex/ARG1))
-includefile(refman.yo)
+includefile(reference-manual.yo)
redef(article)(3)(nodeprefix()chapter(ARG1)nodeprefix(Mutopia ))
COMMENT(yodl2texinfo should be able to cope now, although ugly...)
-TITLE INFORMATION: INSTALL - compiling and installing GNU LilyPond
-AUTHOR INFORMATION: HWN & JCN
-
-Contents
-
-1: ABSTRACT
-2: OBTAINING
-3: PREREQUISITES
-4: RUNNING
-5: WEBSITE
-6: CONFIGURING and COMPILING
-7: CONFIGURING FOR MULTIPLE PLATFORMS
-8: INSTALLING
-9: REDHAT LINUX
-10: DEBIAN GNU/LINUX
-11: WINDOWS NT/95
-12: AUTHORS
+ INSTALL - compiling and installing GNU LilyPond
+
+ HWN & JCN
+
+Contents
+
+ 1: ABSTRACT
+2: OBTAINING
+3: PREREQUISITES
+4: RUNNING
+5: WEBSITE
+6: CONFIGURING and COMPILING
+7: CONFIGURING FOR MULTIPLE PLATFORMS
+8: INSTALLING
+9: REDHAT LINUX
+10: DEBIAN GNU/LINUX
+11: WINDOWS NT/95
+12: AUTHORS
1: ABSTRACT
-This document explains what you need to install LilyPond, and what you
-should do. If you are going to compile and install LilyPond often,
-e.g. when doing development, you might want to check out the
-buildscripts/set-lily.sh script. It sets some environment
-variables and symlinks, which comes in handly when you have to compile
-LilyPond more often.
+This document explains what you need to install LilyPond,
+and what you should do. If you are going to compile and
+install LilyPond often, e.g. when doing development, you
+might want to check out the buildscripts/set-lily.sh script.
+It sets some environment variables and symlinks, which comes
+in handly when you have to compile LilyPond more often.
2: OBTAINING
-You can get the latest version of LilyPond at
-ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/. Refer to the links
+You can get the latest version of LilyPond at
+ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/. Refer to the links
document for mirror sites.
-If you upgrade by patching do remember to rerun autoconf after
-applying the patch.
+If you upgrade by patching do remember to rerun autoconf
+after applying the patch.
3: PREREQUISITES
For compilation you need:
-o A GNU system: GNU LilyPond is known to run on these GNU systems: Linux
- (PPC, intel), FreeBSD, AIX, NeXTStep, IRIX, Digital Unix and
-Solaris.
+o A GNU system: GNU LilyPond is known to run on these GNU
+ systems: Linux (PPC, intel), FreeBSD, AIX, NeXTStep,
+ IRIX, Digital Unix and Solaris.
-o Lots of disk space: LilyPond takes between 30 and 100 mb to
-compile if you use debugging information. If you are short on
-disk-space run configure with --disable-debugging.
+o Lots of disk space: LilyPond takes between 30 and 100
+ mb to compile if you use debugging information. If you
+ are short on disk-space run configure with --disable-
+ debugging.
-Although we recommend to use Unix, LilyPond is known to run on Windows
-NT/95/98 as well. See Section [w32].
+ Although we recommend to use Unix, LilyPond is known to
+ run on Windows NT/95/98 as well. See Section 11.
-o EGCS 1.1 or newer.
+o EGCS 1.1 or newer.
-o Python 1.5,
-Check out
-ftp://ftp.python.org or ftp://ftp.cwi.nl/pub/python.
+o Python 1.5, Check out ftp://ftp.python.org or
+ ftp://ftp.cwi.nl/pub/python.
-o GUILE 1.3, check out http://www.gnu.org/software/guile/guile.html.
+o GUILE 1.3, check out http://www.gnu.org/soft-
+ ware/guile/guile.html.
-o GNU make.
-Check out ftp://ftp.gnu.org.
+o GNU make. Check out ftp://ftp.gnu.org.
-o Flex (version 2.5.4 or newer).
-Check out ftp://ftp.gnu.org.
+o Flex (version 2.5.4 or newer). Check out
+ ftp://ftp.gnu.org.
-o Bison (version 1.25 or newer).
-Check out ftp://ftp.gnu.org.
+o Bison (version 1.25 or newer). Check out
+ ftp://ftp.gnu.org.
-o Yodl. All documentation will be in Yodl. (1.30.17)
-ftp://ftp.lilypond.org/pub/yodl
+o Yodl. All documentation will be in Yodl. (1.30.17)
+ ftp://ftp.lilypond.org/pub/yodl
-o The geometry package for LaTeX is needed to use ly2dvi.
-Available at
-ftp://ftp.ctan.org/tex-archive/macros/latex/contrib/supported/geometry
-or at mirror site ftp://ftp.dante.de
+o The geometry package for LaTeX is needed to use ly2dvi.
+ Available at ftp://ftp.ctan.org/tex-
+ archive/macros/latex/contrib/supported/geometry or at
+ mirror site ftp://ftp.dante.de
4: RUNNING
-GNU LilyPond does use a lot of resources. For operation you need the
-following software
+GNU LilyPond does use a lot of resources. For operation you
+need the following software
+
+o TeX
+
+o A PostScript printer and/or viewer (such as
+ Ghostscript) is strongly recommended. Xdvi will show
+ all embedded PostScript too if you have Ghostscript
+ installed.
-o TeX
-o A PostScript printer and/or viewer (such as Ghostscript) is strongly
- recommended. Xdvi will show all embedded PostScript too if you have
- Ghostscript installed.
-o GUILE 1.3, check out http://www.gnu.org/programs/guile.html
+o GUILE 1.3, check out http://www.gnu.org/pro-
+ grams/guile.html
-For running LilyPond successfully you have to help TeX and MetaFont
-find various files. The recommended way of doing so is adjusting the
-environment variables in the start-up scripts of your shell. An
-example is given here for the Bourne shell:
-export MFINPUTS="/usr/local/share/lilypond/mf:"
-export TEXINPUTS="/usr/local/share/lilypond/tex:/usr/local/share/lilypond/ps:"
+For running LilyPond successfully you have to help TeX and
+MetaFont find various files. The recommended way of doing
+so is adjusting the environment variables in the start-up
+scripts of your shell. An example is given here for the
+Bourne shell:
-The empty path component
-represents TeX and MetaFont's default search paths. Scripts with
-the proper paths for the bourne and C-shell respectively are generated in
-buildscripts/out/lilypond-profile and
-buildscripts/out/lilypond-login during compilation.
+ export MFINPUTS="/usr/local/share/lilypond/mf:"
+ export TEXINPUTS="/usr/local/share/lilypond/tex:/usr/local/share/lilypond/ps:"
-LilyPond is a hideously slow program. A fast CPU and plenty of RAM is
-recommended for comfortable use.
+The empty path component represents and MetaFont's default
+
+search paths. Scripts with the proper paths for the bourne
+and C-shell respectively are generated in build-
+scripts/out/lilypond-profile and buildscripts/out/lilypond-
+login during compilation.
+
+LilyPond is a hideously slow program. A fast CPU and plenty
+of RAM is recommended for comfortable use.
5: WEBSITE
-If you want to auto-generate Lily's website, you'll need some additional
-conversion tools.
+If you want to auto-generate Lily's website, you'll need
+some additional conversion tools.
+
+o xpmtoppm (from the Portable Bitmap Utilities) (For Red-
+ Hat Linux users: it is included within the package
+ libgr-progs). the original is at ftp://ftp.x.org/con-
+ trib/utilities/netpbm-1mar1994.p1.tar.gz
-o xpmtoppm (from the Portable Bitmap Utilities) (For RedHat Linux
- users: it is included within the package libgr-progs).
- the original is at
-ftp://ftp.x.org/contrib/utilities/netpbm-1mar1994.p1.tar.gz
+o pnmtopng, which is also in libgr-progs for RedHat. The
+ original is at
+ ftp://swrinde.nde.swri.edu/pub/png/applications/pnm-
+ topng-2.37.2.tar.gz.i
-o pnmtopng, which is also in libgr-progs for RedHat. The original is
-at
-ftp://swrinde.nde.swri.edu/pub/png/applications/pnmtopng-2.37.2.tar.gz.i
+ The version of pnmtopng that is distributed with RedHat
+ 5.1 and 5.2 contains a bug: pnmtopng is dynamically
+ linked to the wrong version of libpng. Recompile it
+ from source, and make sure that the pnmtopng binary is
+ linked statically to the libpng that is included in
+ libgr. RedHat 6.0 does not have this problem.
-The version of pnmtopng that is distributed with RedHat 5.1 and
-5.2 contains a bug: pnmtopng is dynamically linked to the wrong
-version of libpng. Recompile it from source, and make sure that the
-pnmtopng binary is linked statically to the libpng that is included in
-libgr. RedHat 6.0 does not have this problem.
+ tar xzf libgr-2.0.13.tar.gz
+ make
+ cd png
+ rm libpng.so*
+ make pnmtopng
- tar xzf libgr-2.0.13.tar.gz
- make
- cd png
- rm libpng.so*
- make pnmtopng
+ You can then install the new pnmtopng into
+ /usr/local/bin/
-You can then install the new pnmtopng into /usr/local/bin/
+o Bib2html http://pertsserver.cs.uiuc.edu/~hull/bib2html.
+ Which, in turn depends on man2html for proper
-o Bib2html http://pertsserver.cs.uiuc.edu/~hull/bib2html.
- Which, in turn depends on man2html for proper installation.
-man2html can be had from http://askdonald.ask.uni-karlsruhe.de/hppd/hpux/Networking/WWW/Man2html-1.05.
+ installation. man2html can be had from http://askdon-
+ ald.ask.uni-karlsruhe.de/hppd/hpux/Network-
+ ing/WWW/Man2html-1.05.
- TeTeX users should not forget to rerun texhash.
+ The website will build without this utility, but you
+ will not see our hypertextified bibliography.
-You also have to install buildscripts/out/ps-to-gifs in a
+ TeTeX users should not forget to rerun texhash.
+
+You also have to install buildscripts/out/ps-to-gifs in a
directory that is in the path.
6: CONFIGURING and COMPILING
to install GNU LilyPond, simply type:
- gunzip -c lilypond-x.y.z | tar xf -
- cd lilypond-x.y.z
- ./configure # fill in your standard prefix with --prefix
- make
- make install
+ gunzip -c lilypond-x.y.z | tar xf -
+ cd lilypond-x.y.z
+ ./configure # fill in your standard prefix with --prefix
+ make
+ make install
This will install a number of files, something close to:
- /usr/local/man/man1/mi2mu.1
- /usr/local/man/man1/convert-mudela.1
- /usr/local/man/man1/mudela-book.1
- /usr/local/man/man1/lilypond.1
- /usr/local/bin/lilypond
- /usr/local/bin/mi2mu
- /usr/local/share/lilypond/*
- /usr/local/share/locale/{it,nl}/LC_MESSAGES/lilypond.mo
+ /usr/local/man/man1/mi2mu.1
+ /usr/local/man/man1/convert-mudela.1
+ /usr/local/man/man1/mudela-book.1
+ /usr/local/man/man1/lilypond.1
+ /usr/local/bin/lilypond
+ /usr/local/bin/mi2mu
+ /usr/local/share/lilypond/*
+ /usr/local/share/locale/{it,nl}/LC_MESSAGES/lilypond.mo
+
+The above assumes that you are root and have the GNU devel-
+opment tools, and your make is GNU make. If this is not the
+case, you can adjust your environment variables to your
-The above assumes that you are root and have the GNU development
-tools, and your make is GNU make. If this is not the case, you can
-adjust your environment variables to your taste:
+taste:
- export CPPFLAGS="-I /home/me/my_include -DWEIRD_FOOBAR"
- ./configure
+ export CPPFLAGS="-I /home/me/my_include -DWEIRD_FOOBAR"
+ ./configure
-CPPFLAGS are the preprocessor flags.
+CPPFLAGS are the preprocessor flags.
The configure script is Cygnus configure, and it will accept
---help. If you are not root, you will probably have to make it
-with a different --prefix option. Our favourite location is
+--help. If you are not root, you will probably have to make
+it with a different --prefix option. Our favourite location
+is
- ./configure --prefix=$HOME/usr
+ ./configure --prefix=$HOME/usr
-In this case, you will have to set up MFINPUTS, and TEXINPUTS accordingly.
+In this case, you will have to set up MFINPUTS, and TEXIN-
+PUTS accordingly.
-Since GNU LilyPond currently is beta, you are advised to also use
+Since GNU LilyPond currently is beta, you are advised to
+also use
- --enable-debugging
- --enable-checking
+ --enable-debugging
+ --enable-checking
Options to configure include:
-o --enable-printing
- Enable debugging print routines (lilypond -D option)
-o --enable-optimise
- Set maximum optimisation: compile with -O2. This can be
-unreliable on some compiler/platform combinations (eg, DEC Alpha and PPC)
-o --enable-profiling
- Compile with support for profiling.
-o --enable-config
- Output to a different configuration file. Needed for multi-platform
- builds
+--enable-printing
+ Enable debugging print routines (lilypond -D option)
+
+--enable-optimise
+ Set maximum optimisation: compile with -O2. This can
+ be unreliable on some compiler/platform combinations
+ (eg, DEC Alpha and PPC)
-All options are documented in the configure help
-The option --enable-optimise is recommended for Real Life usage.
+--enable-profiling
+ Compile with support for profiling.
+
+--enable-config
+ Output to a different configuration file. Needed for
+ multi-platform builds
+
+All options are documented in the configure help The option
+--enable-optimise is recommended for Real Life usage.
If you do
- make all
+ make all
-everything will be compiled, but nothing will be installed. The
-resulting binaries can be found in the subdirectories out/ (which
-contain all files generated during compilation).
+everything will be compiled, but nothing will be installed.
+The resulting binaries can be found in the subdirectories
+out/ (which contain all files generated during compilation).
7: CONFIGURING FOR MULTIPLE PLATFORMS
-If you want to compile LilyPond with different configuration settings,
-then, you can use the --enable-config option. Example: suppose I
-want to build with and without profiling. Then I'd use the
-following for the normal build,
+If you want to compile LilyPond with different configuration
+settings, then, you can use the --enable-config option.
+Example: suppose I want to build with and without profil-
+ing. Then I'd use the following for the normal build,
- ./configure --prefix=~ --disable-optimise --enable-checking
- make
- make install
+ ./configure --prefix=~ --disable-optimise --enable-checking
+ make
+ make install
-and for the profiling version, I specify a different configuration.
+and for the profiling version, I specify a different config-
+uration.
- ./configure --prefix=~ --enable-profiling --enable-config=optprof --enable-optimise --disable-checking
- make config=optprof
- make config=optprof install
+ ./configure --prefix=~ --enable-profiling --enable-config=optprof --enable-optimise --disable-checking
+ make config=optprof
+ make config=optprof install
8: INSTALLING
If you have done a successful make, then a simple
- make install
+ make install
should do the trick.
-If you are doing an upgrade, please remember to remove obsolete
-.pk and .tfm files of the fonts. A script has been
+If you are doing an upgrade, please remember to remove obso-
+lete .pk and .tfm files of the fonts. A script has been
provided to do the work for you, see bin/clean-fonts.sh.
CAVEATS
-o The -O2 option triggers bugs on various platforms (PowerPC, Alpha).
- If you experience problems, you should first try turning off
- this.
-o On PPC you need at least EGCS-1.1.2f.
+o The -O2 option triggers bugs on various platforms
+ (PowerPC, Alpha). If you experience problems, you
+ should first try turning off this.
+
+o On PPC you need at least EGCS-1.1.2f.
EXAMPLE
This is what I type in my xterm:
- lilypond someinput.ly
- tex someinput.tex
- xdvi someinput&
+ lilypond someinput.ly
+ tex someinput.tex
+ xdvi someinput&
This is what the output looks like over here:
- GNU LilyPond 0.0.78 #4/FlowerLib 1.1.24 #0
- Parsing ... [/home/hw/share/lilypond/init//
- <..etc..>
- init//performer.ly]]][input/kortjakje.ly]
- Creating elements ...[8][16][24][25]
- Preprocessing elements...
- Calculating column positions ... [14][25]
- Postprocessing elements...
- TeX output to someinput.tex ...
- Creating MIDI elements ...MIDI output to someinput.midi ...
+ GNU LilyPond 0.0.78 #4/FlowerLib 1.1.24 #0
+ Parsing ... [/home/hw/share/lilypond/init//
+ <..etc..>
+ init//performer.ly]]][input/kortjakje.ly]
+ Creating elements ...[8][16][24][25]
+ Preprocessing elements...
+ Calculating column positions ... [14][25]
+ Postprocessing elements...
+ TeX output to someinput.tex ...
+ Creating MIDI elements ...MIDI output to someinput.midi ...
- hw:~/musix/spacer$ xdvi someinput&
- [1] 855
+ hw:~/musix/spacer$ xdvi someinput&
+ [1] 855
-Check out the input files, some of them have comments
-Please refer to the man page for more information.
+Check out the input files, some of them have comments Please
+refer to the man page for more information.
9: REDHAT LINUX
-RedHat Linux users can compile an RPM. A spec file is in
-make/out/lilypond.spec, it is distributed along with the
+RedHat Linux users can compile an RPM. A spec file is in
+make/out/lilypond.spec, it is distributed along with the
sources.
You can make the rpm by issuing
- rpm -tb lilypond-x.y.z.tar.gz
- rpm -i /usr/src/redhat/RPMS/i386/lilypond-x.y.z
+ rpm -tb lilypond-x.y.z.tar.gz
+ rpm -i /usr/src/redhat/RPMS/i386/lilypond-x.y.z
-Precompiled i386 RedHat RPMS are available from
+Precompiled i386 RedHat RPMS are available from
http://linux.umbc.edu/software/lilypond/rpms/.
10: DEBIAN GNU/LINUX
-A Debian package is also available; contact Anthony Fok
-foka@debian.org. The build scripts are in the subdirectory
+A Debian package is also available; contact Anthony Fok
+foka@debian.org. The build scripts are in the subdirectory
debian/.
11: WINDOWS NT/95
-Separate instructions on building for W32 are avaible
-in the file README-W32.yo.
+Separate instructions on building for W32 are avaible in the
+file README-W32.yo.
12: AUTHORS
+pl 55.uu1
+ - use GS' anti aliasing
+
+pl 55.jcn1
+ - auto-beamer: consider current duration first in ending/starting beam
+ this way, you can have 16ths auto-beamed, in some way, but 8ths never
+ beamAutoEnd_16 = 1;
+ beamAutoEnd_8 = 1/8;
+ - added some classes and few lines of doco to .dstreamrc
+ - refman:
+ * comment out broken
+ * commented out stale tex macros (tex/* dir too)
+ * bfs/new syntax: chords
+ - more midi2ly renaming stuff
+ - bf: make info (midi2ly and other renaming)
+
+pl 54.jcn2
+ - bf: auto-beamer: don't beam over skips
+ - update BUGS
+
+
+pl 55.mb2
+ - Font update: added more mensural style time signatures,
+ old2/4, old6/8alt, old4/8 thanks to Christian Mondrup.
+ - bf: correct indentation of first line (removed \leavevmode)
+ plain TeX still gives wrong indentation
+ - bf: volta brackets broken over several lines get open end.
+ Final bracket gets vertical end if it stops at double bar.
+ - Dashed grace flags also for durations shorter than 8.
+ - N.W.Gade: fixed some details
+
+pl 55.mb1
+ - bf: font magnification also in PS output
+ - bf: set the GS_* variables correctly in buildscripts/lilypond-*.sh
+ - bf, lily.scm: errors in (de)crescendo
+ - bf, lilyponddefs: removed \noindent
+
+
+pl 55.hwn1
+ - fixes: horn-concerto-3.ly
+ - bf: grace before tuplet.
+ - bf: decrescendo
+ - bf: multimeasrest numbers centered.
+
+****************
+
pl 53.jbr2
- Documentation/ntweb/index.html: Updated nt distribution web page
NAME
-PATCHES - track and distribute your code changes
+ PATCHES - track and distribute your code changes
DESCRIPTION
-This page documents how to distribute your changes to GNU lilypond
+ This page documents how to distribute your changes to
+GNU lilypond
ABSTRACT
-We would like to have unified context diffs with full pathnames. A
-script automating supplied with Lily.
+ We would like to have unified context diffs with full
+pathnames. A script automating supplied with Lily. Dis-
+tributing a change normally goes like this:
- Distributing a change normally
-goes like this:
+o make your fix/add your code
-o make your fix/add your code
-o Add changes to NEWS, and add yourself to Documentation/AUTHORS.yo
-o generate a patch,
-o e-mail your patch to one of the mailing lists
- gnu-music-discuss@gnu.org or bug-gnu-music@gnu.org
+o Add changes to NEWS, and add yourself to Documenta-
+ tion/AUTHORS.yo
+
+o generate a patch,
+
+o e-mail your patch to one of the mailing lists gnu-
+ music-discuss@gnu.org or bug-gnu-music@gnu.org
GENERATING A PATCH
-In VERSION, set MY_PATCH_LEVEL:
+ In VERSION, set MY_PATCH_LEVEL:
- VERSION:
- ...
- MY_PATCH_LEVEL=jcn1
+ VERSION:
+ ...
+ MY_PATCH_LEVEL=jcn1
In NEWS, enter a summary of changes:
- NEWS:
- pl 0.1.73.jcn1
- - added PATCHES.yo
+ NEWS:
+ pl 0.1.73.jcn1
+ - added PATCHES.yo
Then, from the top of Lily's source tree, type
- make dist
- make diff
+ make dist
+ make diff
-which rolls the tarball ../releases/lilypond-0.1.73.tar.gz
-and leaves your patch as ./lilypond-0.1.73.jcn1.diff.
- ('Make diff' generates a patch between two tarballs. For
-more info type 'make diff help=='.) We assume that there is a tarball
-lilypond-0.1.73.tar.gz in the directory ../releases.
+which rolls the tarball ../releases/lilypond-0.1.73.tar.gz
+and leaves your patch as ./lilypond-0.1.73.jcn1.diff. [1]
+We assume that there is a tarball lilypond-0.1.73.tar.gz in
+the directory ../releases.
If you didn't configure Lily using --srcdir, you can do:
- make release
+ make release
- tar-ball: ../patches/lilypond-0.1.73.jcn1.gz
- patch: ../patches/lilypond-0.1.73.jcn1.gz
- updeet: ../test/updeet
+ tar-ball: ../patches/lilypond-0.1.73.jcn1.gz
+ patch: ../patches/lilypond-0.1.73.jcn1.gz
+ updeet: ../test/updeet
PREREQUISITES
For creating a patch you need
-o All items mentioned in INSTALL. You're not going to send a patch
- that you haven't even built, right?
-o GNU diff
-o Python (version 1.5 or newer).
- You can of course make a patch by hand, which would go something like:
+o All items mentioned in INSTALL. You're not going to
+ send a patch that you haven't even built, right?
+
+o GNU diff
- make distclean
- cd ..
- diff -urN lilypond-0.1.73 lilypond-0.1.73.jcn1 > lilypond-0.1.73.jcn1
+o Python (version 1.5 or newer). You can of course make
+ a patch by hand, which would go something like:
-but there are handy python scripts available. If you're doing development,
-you'll need Python for other LilyPond scripts anyway.
+-----------
+[1] 'Make diff' generates a patch between two tar-
+balls. For more info type 'make diff help=='.
-o The Lily directory structure, which looks like:
+ make distclean
+ cd ..
+ diff -urN lilypond-0.1.73 lilypond-0.1.73.jcn1 > lilypond-0.1.73.jcn1
- doos/ # gnu/windows32 build and binary releases
- harmonia -> harmonia-x.y.z
- harmonia-x.y.z/
- lilypond -> lilypond-x.y.z # symlink to development directory
- lilypond-x.y.z/ # current development
- patches/ # patches between different releases
- RedHat/BUILD # RedHat build and binary releases
- RedHat/RPMS
- RedHat/SPECS
- releases/ # .tar.gz releases
- test/ # tarballs and diffs from current version
- yodl -> yodl-1.30.17
- yodl-1.30.17
+ but there are handy python scripts available. If
+ you're doing development, you'll need Python for other
+ LilyPond scripts anyway.
-with prefix $HOME/usr/src
-and (for building rpms only) in $HOME/.rpmrc:
+o The Lily directory structure, which looks like:
- topdir: /home/fred/usr/src/RedHat
+ doos/ # gnu/windows32 build and binary releases
+ harmonia -> harmonia-x.y.z
+ harmonia-x.y.z/
+ lilypond -> lilypond-x.y.z # symlink to development directory
+ lilypond-x.y.z/ # current development
+ patches/ # patches between different releases
+ RedHat/BUILD # RedHat build and binary releases
+ RedHat/RPMS
+ RedHat/SPECS
+ releases/ # .tar.gz releases
+ test/ # tarballs and diffs from current version
+ yodl -> yodl-1.30.17
+ yodl-1.30.17
+
+ with prefix $HOME/usr/src and (for building rpms only)
+ in $HOME/.rpmrc:
+
+ topdir: /home/fred/usr/src/RedHat
APPLYING PATCHES
-If you're following LilyPond development regularly, you probably want to
-download just the patch for each subsequent release.
-After downloading the patch (into the patches directory, of course), simply
-apply it:
+If you're following LilyPond development regularly, you
+probably want to download just the patch for each subsequent
+release. After downloading the patch (into the patches
+directory, of course), simply apply it:
- gzip -dc ../patches/lilypond-0.1.74.diff.gz | patch -p1 -E
+ gzip -dc ../patches/lilypond-0.1.74.diff.gz | patch -p1 -E
and don't forget to make automatically generated files:
- autoconf footnote(patches don't include automatically generated files,
- i.e. file(configure) and files generated by file(configure).)
+ autoconf footnote(patches don't include automatically generated files,
+ i.e. file(configure) and files generated by file(configure).)
- configure
+ configure
SYNCHRONISE
-If you're not very quick with sending your patch, there's a good
-chance that an new release of LilyPond comes available. In such a
-case, the maintainer will probably ask you to make a new patch against
-the latest release. Your best bet is to download the latest release,
-and apply your patch against this new source tree:
-
- cd lilypond-0.1.74
- gzip -dc ../patches/lilypond-0.1.73.jcn1.diff.gz | patch -p1 -E
- autoconf
- configure
+If you're not very quick with sending your patch, there's a
+good chance that an new release of LilyPond comes available.
+In such a case, the maintainer will probably ask you to make
+a new patch against the latest release. Your best bet is to
+download the latest release, and apply your patch against
+this new source tree:
+
+ cd lilypond-0.1.74
+ gzip -dc ../patches/lilypond-0.1.73.jcn1.diff.gz | patch -p1 -E
+ autoconf
+ configure
Then, make a patch as shown above.
-TITLE INFORMATION: This is the toplevel README to LilyPond
+ This is the toplevel README to LilyPond
- 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, named chords, transposing, formatting scores,
-part extraction. It includes a nice font of musical symbols.
+LilyPond is the GNU Project music typesetter. It transforms
+a musical description file into beautiful sheet music.
1: VERSIONING
-LilyPond uses a versioning scheme similar to the Linux kernel. In a
-version "x.y.z", an even second number 'y' denotes a stable version.
-For development versions 'y' is odd. For using straightforward score
-production, please use the latest stable version. Development versions
-may not produce good or nice scores.
+LilyPond uses a versioning scheme similar to the Linux ker-
+nel. In a version "x.y.z", an even second number 'y'
+denotes a stable version. For development versions 'y' is
+odd. For using straightforward score production, please use
+the latest stable version. Development versions may not
+produce good or nice scores.
2: REQUIREMENTS
-For the compilation and running of LilyPond you need some additional
-packages. Please refer to the installation instructions.
+For the compilation and running of LilyPond you need some
+additional packages. Please refer to the installation
+instructions.
-NOTE: If you downloaded a binary (.rpm or a W95/NT .zip file), then
-you don't have to compile LilyPond.
+NOTE: If you downloaded a binary (.rpm or a W95/NT .zip
+file), then you don't have to compile LilyPond.
3: INSTALLATION
-For your convenience, a formatted copy of the INSTALL instructions are
-in the toplevel directory, as INSTALL.txt
+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: this is done with
-the options --enable-tex-dir and --enable-mf-dir
+The process is fairly straightforward, but chances are that
+you have to specify directories for to configure: this is
+done with the options --enable-tex-dir and --enable-mf-dir
4: DOCUMENTATION
The real documentation is the directory Documentation/
-To generate the pretty-printed docs, you have to run configure first,
-and then do this:
+To generate the pretty-printed docs, you have to run config-
+ure first, and then do this:
- make doc
+make doc
-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
+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/lily-
+pond/index.html
5: COMMENTS
-LilyPond is a long way from finished and polished. We do appreciate
-criticism, comments, bugreports, patches, etc.
+LilyPond is a long way from finished and polished. We do
+appreciate criticism, comments, bugreports, patches, etc.
- Please send your e-mail to one of the MAILING LISTS
+ Please send your e-mail to one of the MAILING LISTS
-and not to us personally. See Documentation/links.yo for more info.
+and not to us personally. See Documentation/links.yo for
+more info.
6: WINDOWS 32
-If you have received this file as part of a DOS/Window32 distribution
-(LilyPond-*.zip), then it is advisable to also download the source
-package, since it might contain more documentation
-ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/
+If you have received this file as part of a DOS/Window32
+distribution (LilyPond-*.zip), then it is advisable to also
+download the source package, since it might contain more
+documentation ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/
-If you decide to build LilyPond from source, please read the INSTALL.txt
-document first, especially the Windows NT/95 section.
+If you decide to build LilyPond from source, please read the
+INSTALL.txt document first, especially the Windows NT/95
+section.
7: CAVEATS
-* Please read the file BUGS for some ugly bugs.
+* Please read the file BUGS for some ugly bugs.
-* If you have installed a previous version, be sure to remove old font
-files, eg
-rm `find /var/lib/texmf/fonts -name 'feta*'`
+* If you have installed a previous version, be sure to
+remove old font files, eg
-a script to do this for you is in buildscripts/clean-fonts.sh
+ rm `find /var/lib/texmf/fonts -name 'feta*'`
+
+a script to do this for you is in buildscripts/clean-
+fonts.sh
8: CDROM DISTRIBUTIONS
-If you have received LilyPond on a cdrom, chances are that development
-has moved a some patchlevels up. Please check the latest version of
-LilyPond before reporting bugs.
+If you have received LilyPond on a cdrom, chances are that
+development has moved a some patchlevels up. Please check
+the latest version of LilyPond before reporting bugs.
Most of the items are marked in the code as well
Grep for TODO and ugh/ugr/urg.
-.* BUGS
+.* TODO before 1.2
+. * rename abc2ly mup2ly
+. * rename 'staff_line_leading' (who is being lead where?) to
+staff_space, interline; (or other meaningful name) and use throughout lily
+. * rename files to class-name:
+. * heads-engraver
+. * request-iterator
+. * p-score
+. * engraver-group
+. * standardise(d) switches: -v, --version; -d, --debug,
+. * Auto_beam debugging output (waarom/wanneer heb jij die weggehaald?)
+. * Auto_beam debugging output (waarom/wanneer heb jij die weggehaald?)
+. * Rename illegal to invalid
+. * Mats:
+
+- The Postscript output is still very experimental
+
+- The reference manual contain a number of exampels that don't
+ pass lilypond, among other the chord syntax.
+
+- Accidentals for grace notes are drawn at the wrong place. See
+ comment in grace.ly
+
+- It is impossible to typeset two textual scripts that are stacked
+ on top of eachother and avoids note collisions and at the same
+ time are typeset with different textStyle. I tried to move around
+ the text_engraver and other engravers between Voice and Thread
+ but the granularity is not fine enough, the scripts have to
+ share the same engraver in order to be get correct vertical
+ position but than they cannot have different style.
+ In my opinion, all scripts that share the same staff, should
+ be stacked vertically, avoiding collisions with the notes
+ in all voices.
+
+- If an \alternative is directly followed by a new \repeat,
+ Lily gives an assertion failure. See the comment in volta.fly
+
+- I'd like to change the \repetitions command to Jan's suggested
+ syntax: \repeat "repeatsymbol" 2 {...}, but I'm not sure that
+ I understand the implementation of repeats well enough.
+
+- The paper11/13/26 files have to be updated.
+. * Grace_slur_engraver.
+. * Break_req handling is silly (break_forbid () + \break fucks up.)
+. * hangOnClef with non-breakable clefs.
+. * do scaled fonts generally
+. * fix partial measures in meaningful way.
+. * relative mode for midi2ly
+. * uniformise recent feta contributions.
+. * bigger and fatter 4/4 C
+. * sort out directory stuff.
+. * --prefix option?
+. * -I option per filetype?
+. * kpathsea?
+. * ly2dvi/lilypond logfile.
+. * fractional chord durs.
+. * hang Item on Spanner
+. * do --safe for PS output?
+. * convert-mudela --output
+. * Staff_margin (with a partial measure.)
+. * fix convert-mudela manpage
+. * decimal point in \paper {}
+. * msgfmt -o check?
+. * add new glyphs to font.ly
+. * formatting of input stuff.
+. * deps for ly2dvi
+. * decide wether to junk _ in lyrics.
. * sane strategy for extensions (assume .ly):
02:22:24 appel ~/usr/src/lilypond$ lilypond foo
GNU LilyPond 1.1.54.
[/home/fred/usr/src/lilypond/scm/lily.scm]
warning: can't find file: `init'
. * indent = 0.0 with linewidth=-1.0
+. * auto-beaming in input/test/spacing.ly.
+huh, snap niks van: gewone beam gaat wel goed. hoe kan abe nu
+invloed hebben op beam-creatie, stopt toch gewoon stokken in?
. * music ending in grace notes.
. * PostScript
. * half notes in pfa
. * didot / big point.
-. * check EGCS version
-. * input/test/stem-spacing.ly: 12/4 touches first note
. * \shape 1st dim skipped?
. * turn slope-damping on/off
. * We need feta-din*.mf files for more sizes than 10.
. * fix dynamics decently, ie. use kerning & ligatures.
-. * dots & rest collisions?
. * behavior of "that the obvious solution
\lyrics { foo1*4 __ _ }" is unintuitive.
. * Lyrics and scripts collide.
-. * a note with a circle after it, meaning:
-
- note + circle = note + 1/4 of its length
-
- the circle is like a dot that's not filled in. for example, on
- page three, the c-sharp on the second line should be a quarter with
- a circle, not a quarter tied to a sixteenth. is this at all
- possible with lily?
. * grace_align_item -> stackingdir = left, weird placement.
-. * grace before triplet, see standchen
-. * tuplets that are written as "number : note", for example
- "3 : [image of a half note here]". possible?
-
. * filenames : junk lily.x
-. * Matanya's tips:
-. * don't shorten stems/staffs closer to each other.
-. * accidentals closer to note head
-. * to space the staffs/staffgroups contained in the score.
-. * heavier beams?
-
.* Cleanups needed
. * \$ and $ identifier syntax in examples.
. * bracket ps code.
. * clef engraver
. * parser
-.* TODO before 1.2
-. * rename midi2ly, abc2ly mup2ly
-. * Grace_slur_engraver.
-. * Break_req handling is silly (break_forbid () + \break fucks up.)
-. * Morally pure LilyPond.
-. * Remove non-free software links.
-. * Remove meta article LilyPond.
+.* BUGS
+. * [c8. c16 c16 c16] in 6/8 timesig.
+
+.* STUFF
. * break priority setting from SCM.
-. * hangOnClef with non-breakable clefs.
+. * Matanya's tips:
+. * don't shorten stems/staffs closer to each other.
+. * accidentals closer to note head
+. * to space the staffs/staffgroups contained in the score.
+. * heavier beams?
+
+. * tuplets that are written as "number : note", for example
+ "3 : [image of a half note here]". possible?
+. * a note with a circle after it, meaning:
+
+ note + circle = note + 1/4 of its length
+
+ the circle is like a dot that's not filled in. for example, on
+ page three, the c-sharp on the second line should be a quarter with
+ a circle, not a quarter tied to a sixteenth. is this at all
+ possible with lily?
+. * scm-ify \property values.
+. * make dependencies () a virtual function.
. * Abstraction for engravers:
. * make "in-between" engraver (Tie, Extender)
. * make wide_spanner_engraver (line_group_spanner, staff_symbol)
-. * do scaled fonts generally
-. * make dependencies () a virtual function.
. * store req -> element, element -> element causes for warnings
-. * include examples in RPM.
-. * fix partial measures in meaningful way.
-. * relative mode for mi2mu
-. * uniformise recent feta contributions.
-. * bigger and fatter 4/4 C
-. * sort out directory stuff.
-. * --prefix option?
-. * -I option per filetype?
-. * kpathsea?
-. * ly2dvi/lilypond logfile.
-. * fractional chord durs.
-. * hang Item on Spanner
-. * do --safe for PS output?
-. * convert-mudela --output
-. * Staff_margin (with a partial measure.)
-. * fix convert-mudela manpage
-. * decimal point in \paper {}
-. * scm-ify \property values.
-. * move class Lookup {} into scm
-. * msgfmt -o check?
-. * add new glyphs to font.ly
-. * formatting of input stuff.
-. * broken scripts:
- lbheel = \script { "bheel" 0 0 -1 0 0 }
- rbheel = \script { "bheel" 0 0 1 0 0 }
- lbtoe = \script { "btoe" 0 0 -1 0 0 }
- rbtoe = \script { "btoe" 0 0 1 0 0 }
- lfheel = \script { "fheel" 0 0 -1 0 0 }
- rfheel = \script { "fheel" 0 0 1 0 0 }
- lftoe = \script { "ftoe" 0 0 -1 0 0 }
- rftoe = \script { "ftoe" 0 0 1 0 0 }
-. * deps for ly2dvi
-
-. * decide wether to junk _ in lyrics.
-
-.* STUFF
. * compulsory hshift
+. * dots & rest collisions?
. *
My wish list for lyrics. I dream of a time when I will have enough time to
become familiar enough with the source code to be able to implement some of
beginning of each new line. This would make it easier to follow songs with a
large number of stanzas.
-2. Hyphens between syllables. At the moment there appears to be no easy way
-to position a hyphen mid-way between the syllables it breaks.
-
3. Notes centred above/below lyrics rather than left-aligned.
4. It would be very nice to be able to build some kind of phrasing into the
. * strip EXEs before installing
. * zip target for binary windows dist (JBR)
. * junking \skip req in lyrics
-. * mi2mu empty staffs.
+. * midi2ly empty staffs.
. * use Fourier transformation for rhythmic quantisation.
. * horizontal centering of dynamics
. * $DEPENDENCIES_OUTPUT support
. * tetex: mfplain.mem
. * timesig: sometimes bottom digit too high: Xdvi doesn't handle
newly created fonts correctly.
-.* 3RD PARTY PROJECTS:
-. * make GCC warn about ctor that leaves member vars uninitialised.
-. * GNU patch
-. * 'double-fix' mode: ignore identical fix, rather than suggest
- to revert patch direction when (more or less? exactly) the same
- thing is fixed
+
.* PROJECTS
. * Scripts:
. * stack scripts in chords:
. * Debug logs:
. * derive lily_stream, Dstream, texstream from ostream?
. * indentable stream as baseclass for TeX stream, lily stream, Dstream.
-. * use dstream feature in mi2mu
+. * use dstream feature in midi2ly
. * integrate IO checking into stream class
. * input converters
. * input property
. * abstract grammar.
. * Figure out semicolons.
-. * c4 4 4 4 for c4 c4 c4 c4?
. * <c f a>4 ?
. * Viola mode?
PACKAGE_NAME=LilyPond
MAJOR_VERSION=1
MINOR_VERSION=1
-PATCH_LEVEL=55
+PATCH_LEVEL=56
MY_PATCH_LEVEL=
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# env. vars for the C-shell.
# set environment for LilyPond. To be installed in /etc/profile.d/
-setenv GS_LIB "@datadir@/afm"
-setenv GS_FONTPATH "@datadir@/ps"
+setenv GS_LIB "@datadir@/ps"
+setenv GS_FONTPATH "@datadir@/afm"
# bit silly. for ly2dvi, overrules compiled-in datadir...
setenv LILYPONDPREFIX "@datadir@"
# set environment for LilyPond. To be installed in /etc/profile.d/
-GS_LIB="@datadir@/afm"
-GS_FONTPATH="@datadir@/ps"
+GS_LIB="@datadir@/ps"
+GS_FONTPATH="@datadir@/afm"
# bit silly. for ly2dvi, overrules compiled-in datadir...
LILYPONDPREFIX="@datadir@"
rm -f $BASE{.ppm,.$GIF} $BASE-page*{.ppm,.$GIF}
# generate the pixmap at twice the size, then rescale (for antialiasing)
-cat $FILE | gs -sDEVICE=ppmraw $SIZE -sOutputFile="$BASE-page%d.ppm" -r180 -dNOPAUSE - -c quit $FILE
+cat $FILE | gs -sDEVICE=pgm $SIZE -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile="$BASE-page%d.ppm" -r90 -dNOPAUSE - -c quit $FILE
# quant is soo slow
# cat $PPMFILE | ppmquant 2 | pnmscale 0.3333 | pnmcrop | $PNMTOGIF $color > $OUTFILE
PPMS=`ls $BASE*ppm`
for i in $PPMS; do
o=`dirname $i`/`basename $i .ppm`.$GIF
- cat $i | pnmscale 0.5 | $CROP | $PNMTOGIF $color > $o
+ cat $i | $CROP | $PNMTOGIF $color > $o
rm $i
done
echo Setting up links
echo
showln -sf $LILYPOND_SOURCEDIR/lily/out/lilypond $prefix/bin/lilypond
-showln -sf $LILYPOND_SOURCEDIR/mi2mu/out/mi2mu $prefix/bin/mi2mu
+showln -sf $LILYPOND_SOURCEDIR/midi2ly/out/midi2ly $prefix/bin/midi2ly
showln -sf $LILYPOND_SOURCEDIR/scripts/out/ly2dvi $prefix/bin/ly2dvi
showln -sf $LILYPOND_SOURCEDIR/scripts/out/mudela-book $prefix/bin/mudela-book
showln -sf $LILYPOND_SOURCEDIR/buildscripts/out/genheader $prefix/bin/genheader
# rename to .dstreamrc and place in the directory where you're doing
# the debugging.
+# Set this to 1 to get default silence for unlisted classes
+Dstream_default_silence 0
+
+# In any case: for listed classes:
+# 0: verbose
+# 1: silent
+
# class name silence?
+
Dstream 0
# yydebug
Atom 1
Axis_group_administration 1
Axis_group_spanner 1
-Auto_beam_engraver 0
+Articulation_req 1
+Auto_beam_engraver 1
Audio_column 1
Audio_element 1
Audio_item 1
Engraver 1
Engraver_group_engraver 1
General_script_def 1
+Global_translator 1
Graphical_element 1
Graphical_axis_group 1
Group_change_req 1
Note_performer 1
Note_req 1
Paper_column 1
+Paper_outputter 1
Paper_score 1
Paper_def 1
Partial_measure_req 1
Staff_commands 1
Staff_symbol 1
Stem 1
-Stem_info 1
+Stem_info 0
Stem_req 1
String_identifier 1
Relative_octave_music 1
Text_def 1
Text_item 1
Text_req 1
+Text_script_req 1
Time_description 1
Time_signature_change_req 1
Translation_property 1
--- /dev/null
+\score{\notes{
+c'' \< \! c'' d'' \decr e'' \rced
+< f''1 {s4 \< \! s4 \> \! s2 } >
+}}
\score {\notes \context Voice = VA \relative c'' {
\grace c8 c4
- \grace { [c32 c32] } c4
+ \grace { [c32 cis32] } c4
+ \grace { [c32 c32] } \times 2/3 { [c8 c c] }
\grace { [b32 ( c32] } c4
- \grace c8 [c8 c8]
+ \grace c16 [c8 c8]
}
}
c''1^"timeSignatureStyle = \"C\""
\time 2/2;
c1
+\time 2/4;
+c2
\time 3/4;
c2.
\time 4/4;
c1^"timeSignatureStyle = \"old\""
\time 2/2;
c1
+\time 2/4;
+c2
\time 3/4;
c2.
\time 4/4;
c1^"timeSignatureStyle = \"\""
\time 2/2;
c1
+\time 2/4;
+c2
\time 3/4;
c2.
\time 4/4;
c1^"timeSignatureStyle = \"1\""
\time 2/2;
c1
+\time 2/4;
+c2
\time 3/4;
c2.
\time 4/4;
\property Staff.timeSignatureStyle = "old6/8"
\time 1/1;
c1^"old6/8"
+\property Staff.timeSignatureStyle = "old6/8alt"
+\time 1/1;
+c1^"old6/8alt"
\property Staff.timeSignatureStyle = "old9/4"
\time 1/1;
c1^"old9/4"
\property Staff.timeSignatureStyle = "old2/2"
\time 1/1;
c1^"old2/2"
+\property Staff.timeSignatureStyle = "old2/4"
+\time 1/1;
+c1^"old2/4"
+\property Staff.timeSignatureStyle = "old4/8"
+\time 1/1;
+c1^"old4/8"
\property Staff.timeSignatureStyle = "C4/4"
\time 1/1;
c1^"C4/4"
--- /dev/null
+% Test of prima/secunda volta brackets in conjunction with
+% line breaks and special bars.
+
+c' d e f |
+\repeat semi 2 { g a b c }
+\alternative { { c b a g a g a g} { f e d c } } \break
+c, d e f | % Assertion failure if this line is removed!!
+\repeat semi 2 { g a b c }
+\alternative { { c b a g \break a g a g} { f e d c } } \break
+c, d e f |
+\repeat semi 2 { g a b c }
+\alternative { { c b a g \break a g a g \break a b a b } { f e d c } } \break
+c, d e f |
+\repeat semi 2 { g a b c }
+\alternative { { c b a g } { f e d c \break a g a g} } \break
+c, d e f |
+\repeat semi 2 { g a b c }
+\alternative { { c b a g a g a g} { f e d c \bar "|.";} }
Atom::Atom(SCM s)
{
func_ = s;
+ magn_ = gh_int2scm (0);
}
timer_l_ = dynamic_cast<Timing_engraver*> (t);
}
+bool
+Auto_beam_engraver::do_try_music (Music* m)
+{
+ /*
+ Mag dit? Nu word-i toch maar geswallowed, en
+ komt er dus ook geen announce...
+ */
+ if (Skip_req* s = dynamic_cast <Skip_req*> (m))
+ {
+ if (stem_l_arr_p_)
+ end_beam ();
+ return true;
+ }
+ return false;
+}
+
void
Auto_beam_engraver::do_process_requests ()
{
- consider_end_and_begin ();
+ consider_end_and_begin (shortest_mom_);
}
void
-Auto_beam_engraver::consider_end_and_begin ()
+Auto_beam_engraver::consider_end_and_begin (Moment test_mom)
{
if (!timer_l_)
return;
int num = time->whole_per_measure_ / time->one_beat_;
int den = time->one_beat_.den_i ();
String time_str = String ("time") + to_str (num) + "_" + to_str (den);
+
String type_str;
- if (shortest_mom_.num () != 1)
- type_str = to_str (shortest_mom_.num ());
- if (shortest_mom_.den () != 1)
- type_str = type_str + "_" + to_str (shortest_mom_.den ());
+ if (test_mom.num () != 1)
+ type_str = to_str (test_mom.num ());
+ if (test_mom.den () != 1)
+ type_str = type_str + "_" + to_str (test_mom.den ());
/*
Determine end moment for auto beaming (and begin, mostly 0==anywhere)
reconsider ending/starting beam first.
*/
Moment mom = rhythmic_req->duration_.length_mom ();
+ consider_end_and_begin (mom);
+ if (!stem_l_arr_p_)
+ return;
if (mom < shortest_mom_)
{
if (stem_l_arr_p_->size ())
{
shortest_mom_ = mom;
- consider_end_and_begin ();
+ consider_end_and_begin (shortest_mom_);
if (!stem_l_arr_p_)
return;
}
representing a musical notation symbol. */
Protected_scm func_;
Protected_scm font_;
+ Protected_scm magn_;
};
VIRTUAL_COPY_CONS (Translator);
protected:
+ virtual bool do_try_music (Music*);
virtual void do_pre_move_processing ();
virtual void do_post_move_processing ();
virtual void do_removal_processing ();
virtual void do_creation_processing ();
private:
void begin_beam ();
- void consider_end_and_begin ();
+ void consider_end_and_begin (Moment test_mom);
Beam* create_beam_p ();
void end_beam ();
void junk_beam ();
Molecule text (String style, String text, Paper_def*) const;
Molecule staff_brace (Real dy, int) const;
Molecule staff_bracket (Real dy) const;
- Molecule volta (Real h, Real w, Real thick, bool last_b) const;
+ Molecule volta (Real h, Real w, Real thick, bool vert_start, bool vert_end) const;
Molecule special_time_signature (String, int,int, Paper_def*) const;
Molecule time_signature (int n,int d, Paper_def*) const;
class Spanner : public virtual Score_element {
public:
Drul_array<Item*> spanned_drul_;
+ Array<Breaking_information> broken_info_;
void set_bounds (Direction d, Item*);
*/
virtual void break_into_pieces ();
- Array<Breaking_information> broken_info_;
friend Axis_group_spanner; // UGH
virtual void do_space_processing ();
}
<*>. {
- String msg = _f ("illegal character: `%c\'", YYText ()[0]);
+ String msg = _f ("invalid character: `%c\'", YYText ()[0]);
LexerError (msg.ch_C ());
return YYText ()[0];
}
gh_int2scm (cm.code ()),
SCM_UNDEFINED));
at.font_ = ly_symbol (font_name_.ch_C());
+ at.magn_ = gh_int2scm (0);
+
m.dim_ = cm.dimensions();
m.add_atom (&at);
return m;
if (style.empty_b ())
style = "roman";
- int font_mag = 1;
+ int font_mag = 0;
Real font_h = paper_l->get_var ("font_normal");
if (paper_l->scope_p_->elem_b ("font_" + style))
{
if (font_mag > 1 && font_mag < 7 )
{
/* UGH */
- style = style + String(" scaled \\magstep ") + to_str (font_mag);
w *= mag_steps[font_mag];
ydims *= mag_steps[font_mag];
}
gh_str02scm (text.ch_C()),
SCM_UNDEFINED));
at.font_ = ly_symbol (style);
+ at.magn_ = gh_int2scm (font_mag);
m.add_atom (&at);
return m;
String hairpin = String (decresc ? "de" : "") + "crescendo";
Atom at (gh_list (ly_symbol (hairpin),
+ gh_double2scm (thick),
gh_double2scm (width),
gh_double2scm (height),
gh_double2scm (continued ? height/2 : 0.0),
- gh_double2scm (thick),
SCM_UNDEFINED));
m.dim_.x () = Interval (0, width);
m.dim_.y () = Interval (-2*height, 2*height);
}
Molecule
-Lookup::volta (Real h, Real w, Real thick, bool last_b) const
+Lookup::volta (Real h, Real w, Real thick, bool vert_start, bool vert_end) const
{
Molecule m;
gh_double2scm (h),
gh_double2scm (w),
gh_double2scm (thick),
- gh_int2scm (last_b),
+ gh_int2scm (vert_start),
+ gh_int2scm (vert_end),
SCM_UNDEFINED));
m.dim_[Y_AXIS] = Interval (- h/2, h/2);
else if (measures_i_ > 1)
{
Molecule s ( lookup_l ()->text ("number", to_str (measures_i_), paper_l ()));
-
+ s.align_to (X_AXIS, CENTER);
s.translate_axis (3.0 * interline_f, Y_AXIS);
mol_p->add_molecule (s);
}
{
output_scheme (gh_list (ly_symbol ("select-font"),
gh_str02scm (symbol_to_string (i->font_).ch_C()),
+ SCM (i->magn_),
SCM_UNDEFINED));
}
}
char c = (dir_ == UP) ? 'u' : 'd';
- return lookup_l ()->afm_find (String ("flags-") + to_str (c) + to_str (flag_i_) + style);
+ Molecule m = lookup_l ()->afm_find (String ("flags-") + to_str (c) +
+ to_str (flag_i_));
+ if (!style.empty_b ())
+ m.add_molecule(lookup_l ()->afm_find (String ("flags-") + to_str (c) + style));
+ return m;
}
Interval
{
String s ("Time_description { ");
if (cadenza_b_)
- s += String ("(") + _("cadenza") + ")";
+ s += String ("(") + _("cadenza") + ")";
s += "at ";
s += when_.str ();
s +="\ntime_signature " + (whole_per_measure_/one_beat_).str () +":" +
- (Moment (Moment (1)/one_beat_)).str ();
+ (Moment (Moment (1)/one_beat_)).str ();
s += "\nposition " + to_str (bars_i_) + ":"+ whole_in_measure_.str () +"\n}\n";
return s;
}
DOUT << str ();
#endif
}
+
void
Time_description::OK() const
{
#ifndef NDEBUG
if (!cadenza_b_)
- assert (whole_in_measure_ < whole_per_measure_);
+ assert (whole_in_measure_ < whole_per_measure_);
assert (Moment (0) <= whole_in_measure_);
assert (one_beat_);
#endif
{
if (cadenza_b_ && !b)
{
- if (whole_in_measure_)
- {
- bars_i_ ++; // should do?
- whole_in_measure_ = 0;
- }
+ if (whole_in_measure_)
+ {
+ bars_i_ ++; // should do?
+ whole_in_measure_ = 0;
+ }
}
cadenza_b_ = b ;
}
while (!cadenza_b_ && whole_in_measure_ >= whole_per_measure_)
{
- whole_in_measure_ -= whole_per_measure_;
- bars_i_ ++;
+ whole_in_measure_ -= whole_per_measure_;
+ bars_i_ ++;
}
}
Time_description::try_set_partial_str (Moment p) const
{
if (p<Moment (0))
- return (_ ("partial measure must be non-negative"));
+ return (_ ("partial measure must be non-negative"));
if (p > whole_per_measure_)
- return (_ ("partial measure too large"));
+ return (_ ("partial measure too large"));
return "";
}
return whole_per_measure_-whole_in_measure_;
}
-int
-Time_description::compare (Time_description const &t1, Time_description const&t2)
-{
- int i = sign (t1.when_-t2.when_);
-
- if (!i)
- {
- assert (t1.bars_i_==t2.bars_i_);
- assert (t1.one_beat_ == t2.one_beat_);
- assert (t1.whole_in_measure_ == t2.whole_in_measure_);
- assert (t1.whole_per_measure_ == t2.whole_per_measure_);
- }
-
- return i;
-}
-
Moment
Time_description::next_bar_moment() const
{
void
Tuplet_engraver::acknowledge_element (Score_element_info i)
{
+ bool grace= (i.elem_l_->get_elt_property (grace_scm_sym) != SCM_BOOL_F);
+ if (grace != get_property ("weAreGraceContext",0).to_bool ())
+ return;
+
if (Note_column *nc = dynamic_cast<Note_column *> (i.elem_l_))
{
for (int j =0; j <started_span_p_arr_.size (); j++)
if (!bar_arr_.size ())
return mol_p;
+
+ bool no_vertical_start = false;
+ bool no_vertical_end = last_b_;
+ Spanner *orig_span = dynamic_cast<Spanner*> (original_l_);
+ if (orig_span && orig_span->broken_info_[0].broken_spanner_l_ != this)
+ no_vertical_start = true;
+ if (orig_span && orig_span->broken_info_.top ().broken_spanner_l_ != this)
+ no_vertical_end = true;
+ if (bar_arr_.top ()->type_str_.length_i () > 1)
+ no_vertical_end = false;
Real interline_f = paper_l ()->get_realvar (interline_scm_sym);
Real internote_f = interline_f/2;
Real dx = internote_f;
Real w = extent (X_AXIS).length () - dx;
Real h = paper_l()->get_var ("volta_spanner_height");
- Molecule volta (lookup_l ()->volta (h, w, t, last_b_));
+ Molecule volta (lookup_l ()->volta (h, w, t, no_vertical_start, no_vertical_end));
Molecule num (lookup_l ()->text ("volta", number_str_, paper_l ()));
mkdir -p $RPM_BUILD_ROOT/tmp/lilypond-rpm-doc
mkdir htmldocs
tar -C htmldocs -xzf out/htmldoc.tar.gz
-#tar -C $RPM_BUILD_ROOT/tmp/lilypond-rpm-doc -xzf out/htmldoc.tar.gz
+mkdir -p out/examples/
+tar -cf - input/ | tar -C out/examples/ -xf-
strip lily/out/lilypond midi2ly/out/midi2ly
make prefix="$RPM_BUILD_ROOT/usr" install
%files
%doc htmldocs/
+%doc out/examples/
# hairy to hook it in (possibly non-existing) emacs
%doc mudela-mode.el
Begin3
Titel: LilyPond
-Versie: 1.1.55
-Inschrijf datum: 09JUL99
+Versie: 1.1.56
+Inschrijf datum: 11JUL99
Beschrijving: @FLAPTEKST@
Trefwoorden: muziek typezetten midi notatie
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
- 770k lilypond-1.1.55.tar.gz
+ 770k lilypond-1.1.56.tar.gz
Oorspronkelijke plek: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
- 770k lilypond-1.1.55.tar.gz
+ 770k lilypond-1.1.56.tar.gz
Copi-eer voorwaarden: GPL
End
Begin3
Title: LilyPond
-Version: 1.1.55
-Entered-date: 09JUL99
+Version: 1.1.56
+Entered-date: 11JUL99
Description:
LilyPond is the GNU Project music typesetter. It transforms a musical
janneke@gnu.org (Jan Nieuwenhuizen)
Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys)
Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert
- 770k lilypond-1.1.55.tar.gz
+ 770k lilypond-1.1.56.tar.gz
Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
- 770k lilypond-1.1.55.tar.gz
+ 770k lilypond-1.1.56.tar.gz
Copying-policy: GPL
End
Name: lilypond
-Version: 1.1.55
+Version: 1.1.56
Release: 1
Copyright: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.1.55.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.1.56.tar.gz
Summary: A program for printing sheet music.
URL: http://www.cs.uu.nl/~hanwen/lilypond
Packager: Han-Wen Nienhuys <hanwen@cs.uu.nl>
mkdir -p $RPM_BUILD_ROOT/tmp/lilypond-rpm-doc
mkdir htmldocs
tar -C htmldocs -xzf out/htmldoc.tar.gz
-#tar -C $RPM_BUILD_ROOT/tmp/lilypond-rpm-doc -xzf out/htmldoc.tar.gz
+mkdir -p out/examples/
+tar -cf - input/ | tar -C out/examples/ -xf-
strip lily/out/lilypond midi2ly/out/midi2ly
make prefix="$RPM_BUILD_ROOT/usr" install
%files
%doc htmldocs/
+%doc out/examples/
# hairy to hook it in (possibly non-existing) emacs
%doc mudela-mode.el
draw (0, 0) .. (0,-2 interline);
fet_endchar;
-fet_beginchar("grace 8th Flag (up)", "u3grace", "graceeighthflag")
+fet_beginchar("grace dash (up)", "ugrace", "gracedash")
save flare,
hip_depth_ratio, hip_width,
- foot_depth, foot_width_ratio;
+ foot_depth;
flare# = 1.0 interline#;
hip_depth_ratio = .72;
- foot_width_ratio = .8;
hip_width# = upflag_width# - hip_thickness#/2;
foot_depth# = 3 interline#;
- set_char_box(hip_width# * hip_depth_ratio,
- hip_width# + stemthickness#/2 + right_upflag_space#,
- foot_depth# + foot_thickness#/2, stemthickness#/2)
-
define_pixels(flare, hip_width, hip_thickness,
foot_depth, foot_thickness);
- draw_flag((stemthickness/2,0), flare,
- (hip_width, foot_depth),
- hip_depth_ratio, foot_width_ratio, hip_thickness, foot_thickness);
+
+ set_char_box(hip_width# * hip_depth_ratio,
+ hip_width# + stemthickness#/2 + right_upflag_space#,
+ foot_depth# * hip_depth_ratio, -flare#)
pickup pencircle scaled 1.5 stemthickness;
- draw (0, 0) .. (0,-2 interline);
- draw (-b ,-foot_depth * hip_depth_ratio) ..
- (w, -flare);
+ draw (-b ,-d) ..
+ (w, h);
fet_endchar;
fet_beginchar("8th (down)", "d3", "deighthflag")
fet_endchar;
-fet_beginchar("grace 8th (down)", "d3grace", "dgraceeighthflag")
- save flare,
- hip_depth_ratio, hip_width,
- foot_depth, foot_width_ratio;
+fet_beginchar("grace dash (down)", "dgrace", "dgracedash")
+ save flare, hip_depth_ratio, hip_width, foot_depth;
save flagspace, total_depth, flag_count;
flag_count = 1;
foot_width_ratio = .8;
- set_char_box(hip_width# * hip_depth_ratio,
- hip_width# + stemthickness#/2 + right_downflag_space#,
- total_depth# + foot_thickness#/2, stemthickness#/2)
-
define_pixels(flare, hip_width, hip_thickness,
- flagspace,
- foot_depth, foot_thickness);
-
- draw_flag((stemthickness/2,- (flag_count-1) *flagspace), flare,
- (hip_width, foot_depth),
- hip_depth_ratio,foot_width_ratio, hip_thickness, foot_thickness);
+ flagspace, foot_depth);
+ set_char_box(hip_width# * hip_depth_ratio,
+ hip_width# + stemthickness#/2 + right_downflag_space#,
+ foot_depth# * hip_depth_ratio, -flare#)
pickup pencircle scaled 1.5 stemthickness;
- draw (0, 0) .. (0,-2 interline);
- draw (-b, -foot_depth * hip_depth_ratio) .. (w,-flare);
+ draw (-b, -d) .. (w,h);
y_mirror_char;
fet_endchar;
input feta-klef;
input feta-timesig;
else:
-% input feta-bolletjes;
+ input feta-bolletjes;
% input feta-banier;
% input feta-eindelijk;
% input feta-klef;
%
% source file of the Feta (not an abbreviation of Font-En-Tja) music font
%
-% (c) 1998 Mats Bengtsson <matsb@s3.kth.se>
+% (c) 1998--1999 Mats Bengtsson <matsb@s3.kth.se>,
+% Christian Mondrup <scancm@biobase.dk>
fet_begingroup("timesig");
draw_block((-Cthickness/2, -d), (Cthickness/2, h));
fet_endchar;
+%% tempus imperfectum cum prolatione imperfecta diminutio simplex
+fet_beginchar ("Mensural 4/8 meter", "old4/8", "oldfoureightmeter")
+ set_char_box(.5 Cdiameter# + interline#, .5 Cdiameter# + interline#,
+ .5 Cdiameter#, .5 Cdiameter#);
+
+ pickup pencircle scaled Cthickness;
+ draw threequartercircle rotated 225 scaled Cdiameter;
+fet_endchar;
+
+%% tempus imperfectum cum prolatione perfecta diminutio simplex
+fet_beginchar ("Mensural 6/8 meter", "old6/8alt", "oldsixeightmeteralt")
+ set_char_box(.5 Cdiameter# + interline#, .5 Cdiameter# + interline#,
+ .5 Cdiameter#, .5 Cdiameter#);
+
+ pickup pencircle scaled Cthickness;
+ draw threequartercircle rotated 225 scaled Cdiameter;
+ pickup pencircle scaled 4 stafflinethickness;
+ draw (0,0);
+fet_endchar;
+
+%% tempus imperfectum cum prolatione imperfecta diminutio duplex
+fet_beginchar ("Mensural 2/4 meter", "old2/4", "oldtwofourmeter")
+ set_char_box(.5 Cdiameter# + interline#, .5 Cdiameter# + interline#,
+ interline#, interline#);
+
+ pickup pencircle scaled Cthickness;
+ draw threequartercircle rotated 225 scaled Cdiameter;
+ draw_block((-Cthickness, -d), (0, h));
+fet_endchar;
+
fet_endgroup("timesig");
font_identifier "GRAYCX";
-boolean lightweight;
+%boolean lightweight;
input grayf
-# mi2mu/TODO
+# midi2ly/TODO
Most of the items are marked in the code as well, with full explanation.
grep for TODO and ugh/ugr
* junk one in list vs. array
- * add mi2mu example output (.midi.ly and .gif) to website
+ * add midi2ly example output (.midi.ly and .gif) to website
* important? lily is important, go work on lily!
- * faq about mi2mu midi t1. ?
+ * faq about midi2ly midi t1. ?
PROJECTS
- * write something interesting in mi2mu manual page
+ * write something interesting in midi2ly manual page
* check/use type 0 / 1 / 2 of midi file
* steal good ideas of other gpl midi parsers
* lily: add mudela info into midi as specials
- mi2mu: use special info
+ midi2ly: use special info
+++ /dev/null
-/*
- mi2mu-proto.hh -- declare type names in mi2mu
-
- source file of mi2mu, part of the GNU LilyPond package,
-
- (c) 1997--1998 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-
-#ifndef MI2MU_PROTO_HH
-#define MI2MU_PROTO_HH
-
-class Midi_parser;
-struct Midi_parser_info;
-class Midi_score_parser;
-class Midi_track_parser;
-class Mudela_stream;
-class Mudela_item;
-class Mudela_key;
-class Mudela_time_signature;
-class Mudela_note;
-class Mudela_tempo;
-class Mudela_text;
-class Mudela_score;
-class Mudela_staff;
-class Mudela_voice;
-class Mudela_column;
-
-#endif // MI2MU_PROTO_HH
#include "proto.hh"
#include "moment.hh"
-#include "mi2mu-proto.hh"
+#include "midi2ly-proto.hh"
struct Midi_parser_info
{
#include "midi-parser.hh"
#include "proto.hh"
-#include "mi2mu-proto.hh"
+#include "midi2ly-proto.hh"
#include "parray.hh"
class Midi_score_parser : public Midi_parser
#include "proto.hh"
#include "cons.hh"
#include "moment.hh"
-#include "mi2mu-proto.hh"
+#include "midi2ly-proto.hh"
#include "midi-parser.hh"
class Midi_track_parser : public Midi_parser
--- /dev/null
+/*
+ midi2ly-proto.hh -- declare type names in midi2ly
+
+ source file of midi2ly, part of the GNU LilyPond package,
+
+ (c) 1997--1998 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef MIDI2LY_PROTO_HH
+#define MIDI2LY_PROTO_HH
+
+class Midi_parser;
+struct Midi_parser_info;
+class Midi_score_parser;
+class Midi_track_parser;
+class Mudela_stream;
+class Mudela_item;
+class Mudela_key;
+class Mudela_time_signature;
+class Mudela_note;
+class Mudela_tempo;
+class Mudela_text;
+class Mudela_score;
+class Mudela_staff;
+class Mudela_voice;
+class Mudela_column;
+
+#endif // MIDI2LY_PROTO_HH
#define MUDELA_COLUMN_HH
#include "proto.hh"
-#include "mi2mu-proto.hh"
+#include "midi2ly-proto.hh"
#include "moment.hh"
#include "cons.hh"
#ifndef MUDELA_ITEM_HH
#define MUDELA_ITEM_HH
-#include "mi2mu-proto.hh"
+#include "midi2ly-proto.hh"
#include "string.hh"
#include "moment.hh"
#include "duration.hh"
#ifndef MUDELA_SCORE_HH
#define MUDELA_SCORE_HH
-#include "mi2mu-proto.hh"
+#include "midi2ly-proto.hh"
#include "proto.hh"
#include "cons.hh"
#include "parray.hh"
#ifndef MUDELA_STAFF_HH
#define MUDELA_STAFF_HH
-#include "mi2mu-proto.hh"
+#include "midi2ly-proto.hh"
#include "proto.hh"
#include "cons.hh"
#include "string.hh"
#ifndef MUDELA_STREAM_HH
#define MUDELA_STREAM_HH
-#include "mi2mu-proto.hh"
+#include "midi2ly-proto.hh"
#include "string.hh"
#include "scalar.hh"
#ifndef MUDELA_VOICE_HH
#define MUDELA_VOICE_HH
-#include "mi2mu-proto.hh"
+#include "midi2ly-proto.hh"
#include "cons.hh"
/// (mudela_voice)
#include "duration-convert.hh"
#include "source.hh"
-#include "mi2mu-global.hh"
+#include "midi2ly-global.hh"
#include "midi-score-parser.hh"
#include "mudela-item.hh"
#include "mudela-score.hh"
void
usage()
{
- cout << _f ("Usage: %s [OPTION]... [FILE]", "mi2mu");
+ cout << _f ("Usage: %s [OPTION]... [FILE]", "midi2ly");
cout << '\n';
cout << _ ("Translate midi-file to mudela");
cout << '\n';
void
identify()
{
- LOGOUT(NORMAL_ver) << mi2mu_version_str() << endl;
+ LOGOUT(NORMAL_ver) << midi2ly_version_str() << endl;
}
void
notice()
{
LOGOUT(NORMAL_ver) << '\n';
- LOGOUT(NORMAL_ver) << _ ("Mi2mu, translate midi to mudela");
+ LOGOUT(NORMAL_ver) << _ ("Midi2ly, translate midi to mudela");
LOGOUT(NORMAL_ver) << '\n';
LOGOUT(NORMAL_ver) << _f ("Copyright (c) %s by", "1997, 1998");
LOGOUT(NORMAL_ver) << '\n';
#include <assert.h>
#include "string-convert.hh"
#include "source-file.hh"
-#include "mi2mu-global.hh"
+#include "midi2ly-global.hh"
#include "midi-parser.hh"
Midi_parser_info::Midi_parser_info ()
String
Midi_parser::message (String str)
{
- return String ("mi2mu: ")
+ return String ("midi2ly: ")
+ info_l_->source_l_->name_str () + ": "
+ String_convert::i2dec_str (info_l_->source_l_->line_i ((char const*)info_l_->byte_L_), 0, 0) + ": "
+ str + "\n"
#include "moment.hh"
#include "source-file.hh"
#include "source.hh"
-#include "mi2mu-global.hh"
+#include "midi2ly-global.hh"
#include "midi-score-parser.hh"
#include "midi-track-parser.hh"
#include "mudela-item.hh"
#include <assert.h>
#include "string-convert.hh"
-#include "mi2mu-global.hh"
+#include "midi2ly-global.hh"
#include "midi-track-parser.hh"
#include "mudela-column.hh"
#include "mudela-item.hh"
// copyright 1997 Jan Nieuwenhuizen <janneke@gnu.org>
#include <assert.h>
-#include "mi2mu-global.hh"
+#include "midi2ly-global.hh"
#include "string-convert.hh"
#include "duration-convert.hh"
#include "mudela-column.hh"
#include "moment.hh"
#include "duration.hh"
#include "duration-convert.hh"
-#include "mi2mu-global.hh"
+#include "midi2ly-global.hh"
#include "mudela-column.hh"
#include "mudela-item.hh"
#include "mudela-score.hh"
#include "moment.hh"
#include "duration-convert.hh"
#include "string-convert.hh"
-#include "mi2mu-proto.hh"
-#include "mi2mu-global.hh"
+#include "midi2ly-proto.hh"
+#include "midi2ly-global.hh"
#include "mudela-column.hh"
#include "mudela-item.hh"
#include "mudela-staff.hh"
#include <assert.h>
#include <time.h>
#include <fstream.h>
-#include "mi2mu-global.hh"
+#include "midi2ly-global.hh"
#include "mudela-item.hh"
#include "mudela-stream.hh"
#include "string-convert.hh"
if (no_timestamps_b_g)
*os_p_ << "GNU LilyPond\n";
else
- *os_p_ << mi2mu_version_str() << '\n';
+ *os_p_ << midi2ly_version_str() << '\n';
*os_p_ << _ ("% Automatically generated");
if (no_timestamps_b_g)
*os_p_ << ".\n";
// copyright 1997 Jan Nieuwenhuizen <janneke@gnu.org>
#include "string-convert.hh"
-#include "mi2mu-global.hh"
+#include "midi2ly-global.hh"
#include "mudela-column.hh"
#include "mudela-item.hh"
#include "mudela-staff.hh"
#include "proto.hh"
#include "string.hh"
-const char * mi2mu_version_sz();
+const char * midi2ly_version_sz();
// should simply have Root class...
String
-mi2mu_version_str()
+midi2ly_version_str()
{
- return String (mi2mu_version_sz ())
+ return String (midi2ly_version_sz ())
+ " " + _("of") + " " + __DATE__ + " " + __TIME__;
}
+\version "1.1.52";
+
$global_ii = \notes{
\time 4/4;
\property Staff.timeSignatureStyle = "C2/2"
copyright = "Public Domain";
}
+\version "1.1.52";
+
\include "global-ii.ly"
\include "violoncello-ii.ly";
\$global_ii
\notes\transpose c'' \$violoncello_ii
>
-\version "1.1.52";
\version "1.1.52";
+% {
+
\include "global-i.ly"
\include "viola-i.ly"
-%{
\score{
\$viola_i_staff
\paper{
\translator { \BarNumberingStaffContext }
}
\midi{
-%urg real/duration
+%urg, real/duration
% \tempo 4. = 69;
\tempo 4 . = 50;
}
}
-%}
+
+% }
\include "global-ii.ly"
\include "viola-ii.ly"
\score{
\$viola_ii_staff
\paper{
- castingalgorithm=0.0;
+% castingalgorithm=0.0;
\translator { \BarNumberingStaffContext }
- \translator { \ScoreContext skipBars = 1; }
+ %\translator { \ScoreContext skipBars = 1; }
}
\midi{
- \tempo 2 = 96;
+% \tempo 2 = 96;
+ \tempo 2 = 75;
}
}
copyright = "Public Domain";
}
+\version "1.1.52";
+
$violino_ii = \notes\relative c''{
R1*8 |
r2 e |
\version "1.1.52";
+% {
+
\include "global-i.ly"
\include "violino-i.ly"
-%{
\score{
\$violino_i_staff
\paper{
\tempo 4 . = 50;
}
}
-%}
+
+% }
\include "global-ii.ly"
\include "violino-ii.ly"
\$violino_ii_staff
\paper{
\translator { \BarNumberingStaffContext }
- castingalgorith=0;
+% castingalgorith=0;
}
\midi{
-% \tempo 4. = 69;
- \tempo 4 . = 50;
+% \tempo 2 = 96;
+ \tempo 2 = 75;
}
}
\version "1.1.52";
+% {
\include "violino-i.ly";
\include "viola-i.ly";
}
}
+% }
\include "violino-ii.ly";
\include "viola-ii.ly";
\version "1.1.52";
+% {
\include "violino-i.ly";
\include "violoncello-i.ly";
}
}
+% }
+
\include "violino-ii.ly";
\include "violoncello-ii.ly";
}
}
\midi{
- \tempo 2 = 96;
+% \tempo 2 = 96;
+ \tempo 2 = 75;
}
}
\version "1.1.52";
+% {
+
\include "global-i.ly"
\include "violoncello-i.ly"
-%{
\score{
\$violoncello_i_staff
\paper{
\tempo 4 . = 69;
}
}
-%}
+
+% }
\include "global-ii.ly"
\include "violoncello-ii.ly"
\score{
\$violoncello_ii_staff
\paper{
- castingalgorithm=0.;
+ %castingalgorithm=0.;
\translator { \BarNumberingStaffContext }
}
\midi{
- \tempo 2 = 96;
+% \tempo 2 = 96;
+ \tempo 2 = 75;
}
}
) g r r |
g [g8. ( a16 ] ) g4 |
R2. |
-r4 r [g8^""^"solo" \mf \< () \! e' ] |
-\grace d8 g2 \> ( [ \! e8. c16 ] |
+r4 r [g8^""^"solo" \mf \< () e' ] |
+\grace d8 \! g2 \> ( [ \! e8. c16 ] |
) g2 r4 |
R2. |
r4 r \times 2/3 {[e'8 \f ( g, ) g'] } |
\globalNoKey
}
-marks=\notes {
+marks= \notes {
\time 3/4;
-\property Voice.textStyle = "Large"
-\skip 2.*31;
-s2 s8 s^"\\Allegromoltovivace"
+%\property Thread.textStyle = "Large"
+s2.^"\\raisebox{4mm}{\\bfseries\Large Andante con moto}"
+\skip 2.*30;
+s2 s8 s^"\\raisebox{4mm}{\\bfseries\Large Allegro molto vivace}"
\time 2/4;
\skip 2*12;
\mark "A";
-% Defined as macros so Lilypond doesn't assign any horisontal spacing.
-\newcommand{\Allegromoltovivace}{\hspace{-10mm}\raise 20pt\hbox{
- \Large \textbf{Allegro molto vivace}}}
-%\newcommand{\Andanteconmoto}{\hspace{-12mm}\raise 20pt\hbox{
-% \Large Andante con moto}}
-\newcommand{\Andanteconmoto}{}
-\renewcommand{\thepiece}{Andante con moto}
+\def\fetdef#1#2{%
+ \def#1{\hbox{\fetchar{#2}}}}
+\font\fetasixteen = feta16
+\def\fetchar#1{{\fetasixteen\char#1}}
+\input{feta20} %%% Add lilypond-xxx/mf/out/ to TEXINPUTS
\newcommand{\okt}{$8^{va}$}
\vspace*{-10mm}%
\begin{center}
\bfseries
- \ifx\mudelanull\thetitle\else\sethuge{\thetitle}\\ \fi
- \ifx\mudelanull\thesubtitle\else\setLarge{\thesubtitle}\\ \fi
+ \ifx\mudelanull\thetitle\else{\huge\thetitle}\\ \fi
+ \ifx\mudelanull\thesubtitle\else{\Large\thesubtitle}\\ \fi
\end{center}
\bigskip
% urg
\edef\saveparskip{\parskip}\parskip-5mm
\begin{minipage}[t]{0.45\textwidth}
- \ifx\mudelanull\thepoet\else\settext{\thepoet}\\ \fi
- \ifx\mudelanull\themetre\else\settext{\themetre}\\ \fi
+ \ifx\mudelanull\thepoet\else{\thepoet}\\ \fi
+ \ifx\mudelanull\themetre\else{\themetre}\\ \fi
\end{minipage}\hspace*{\fill}
\begin{minipage}[t]{0.45\textwidth}
\begin{flushright}
- \ifx\mudelanull\thecomposer\else\setlarge{\normalfont\scshape\thecomposer}\\ \fi
- \ifx\mudelanull\theopus\else\settext{\theopus}\\ \fi
- \ifx\mudelanull\thearranger\else\settext{\thearranger}\\ \fi
+ \ifx\mudelanull\thecomposer\else{\large\normalfont\scshape\thecomposer}\\ \fi
+ \ifx\mudelanull\theopus\else{\theopus}\\ \fi
+ \ifx\mudelanull\thearranger\else{\thearranger}\\ \fi
\end{flushright}%
\end{minipage}\par
\parskip\saveparskip
-% {\center\setlarge{\theinstrument}\par}
-% {\flushleft\setLarge{\normalfont\scshape\thepiece}}
- {\flushleft\setLarge{\textbf\thepiece}}
- \leavevmode
- \enlargethispage*{5mm}
+ {\flushleft{\Large\textbf\thepiece}\par}%
+% \leavevmode%
+ \enlargethispage*{5mm}%
}
skipBars = 1;
markScriptPadding = "6.0";
barNumberScriptPadding = "11.0";
+ dynamicPadding = 3.0;
textScriptPadding = 5.0;
textStyle = "italic";
textEmptyDimension = 1;
\clarI
>
\header{
- instrument = "Clarinetto I in B\\textflat";
+ instrument = "Clarinetto I in B\\flat";
}
\paper{
\my_paper
\clarII
>
\header{
- instrument = "Clarinetto II in B\\textflat";
+ instrument = "Clarinetto II in B\\flat";
}
\paper{
\my_paper
\context Voice = help \trpIhelp
>
\header{
- instrument = "Tromba I in B\\textflat";
+ instrument = "Tromba I in B\\flat";
}
\paper{
\my_paper
\context Voice = help \trpIIhelp
>
\header{
- instrument = "Tromba II in B\\textflat";
+ instrument = "Tromba II in B\\flat";
}
\paper{
\my_paper
\oboe
>
\context Voice = clarI <
- \property Staff.instrument = "Clarinetto I"
+ \property Staff.instrument = "Clar. I in B\\flat "
\property Staff.instr = "Cl. I"
\globalNoKey
\clarI
>
\context Voice = clarII <
- \property Staff.instrument = "Clarinetto II"
+ \property Staff.instrument = "Clar. II in B\\flat "
\property Staff.instr = "Cl. II"
\globalNoKey
\clarII
}
>
\context Staff = trp <
- \property Staff.instrument = "2 Trp. in B\\textflat "
+ \property Staff.instrument = "2 Trp. in B\\flat "
\property Staff.instr = "Trp."
\context Voice = trpI <
\globalNoKey
\translator { \StaffContext
\consists "Staff_margin_engraver";
marginScriptPadding = "15.0";
+ dynamicPadding = 3.0;
textStyle = "italic";
textScriptPadding = 5.0;
textEmptyDimension = 1;
\header{
-title = "Konzert Nr. 3 Es dur"
+title = "Konzert Nr. 3 Es dur";
subtitle = "f\\\"ur Horn und Orchester";
description = "Third horn concerto, for horn in Es";
composer = "W. A. Mozart (1756-1792)";
c, r
R1*1
r8 [g' g g] [g g e c]
- g4 g, r2
+ g'4 g, r2
R1*18
r2 r4 g'4 |
e'4. () c8 [f (d c )b ]
[g'()d ] d4-- r4 d
[d8 () c] c4.( [d16 e] [d8 )c]
[c8(-\trill )b] b4 r2 |
- d2~( [d8 e16 d] [c8 )b] |
+ d2( ~ [d8 e16 d] [c8 )b] |
[b()a-.] a4-> r8 [a-. a-. a-.]
a4 cis e g
- [g16( fis e )d] d4-. r2 | % The g16 really is a grace note.
- % mark B
+ [ \grace g16( fis8 e16 )d] d4-. r2 |
+ \mark "B";
R1*3
r2 r4 [d8 (b ]
[a )g d'( b] [a )g e'( c ]
r1
c,2\p e4 g c e g4. e8 |
d4. [e16 fis] [g () fis e d] [c() b a g]
- a1(-\trill % \grace{g a}
+ a1(-\trill \grace{ g16 a}
)g4 r r2
R1*15
- % mark D
+ \mark "D";
bes2 d4 f
g,2~ [g8 g'( es )c]|
- bes4()a. [c8 d es]
+ bes4( )a4. [c8 d es]
cis4()d r8 [bes (c )d]
es2 () d4 r
es2\p () d4 r
r8 [fis, b dis] fis4 r
r8 [gis, b d] f4 r
r8 [g, b d] f4 r
- %mark E
+ \mark "E";
R1*8
r2 r8 [g,-. g-. g-.]
e'4.() c8 [f( d c )b]
c4.( [d16 e] f4 )e
a, ( d g, )c
d d [
- % \grace {e}
+ \grace { e8 }
d8. c16 d8. e16]
c4 r r2
- % mark F
+ \mark "F";
R1*3
c,2~[c8( e g )c]
[c8()b] b4 r2
r2 r4 [g'8()e]
[d()c g'()e] [d()c a'()f]
[e()d] d4 r [d8 d]
- d4~( [d16 e d )e] [g8() f e d] |
+ d4(~ [d16 e d )e] [g8() f e d] |
c4 r r2
r1
c1 ~
d1-\trill % \grace { c d}
c4 r r2
r1 |
- % mark H
+ \mark "H";
\times 2/3 { [ c8 ()b a ] } \times 2/3 { [ g a b] } \times 2/3 { [ c d e] } \times 2/3 { [ f()e d] } |
\times 2/3 { [ c () b a ] } \times 2/3 { [ g a b] } \times 2/3 { [ c d e] } \times 2/3 { [ f()e d] }|
c4 \times 2/3 { r8 [g'()e]} c4 \times 2/3 { r8 [e () c]} |
c'4.() f8 a,4 a
[bes8( c d bes] )g4 r8 g
a r bes r c r [d()bes]
- a2()[g8 a( bes )b]
+ a2( [)g8 a( bes )b]
c4. () f8 a,4 a |
[bes8 (c d) bes] g4 r8 c,-.
[c8( e g )bes] [a( c f ) d]
c r e r f r r4
- % mark A
+ \mark "A";
R1*8
g4. f8 [e d c bes]
[bes( a d )c] c4 r
[c16\mf () d c-. d-.] [e () f e-. f-.] [g()e c-. c-.] [f()d b-. b-.]
[c16\p () d c-. d-.] [e () f e-. f-.] [g()e c-. c-.] [f()d b-. b-.]
[c8 c, c c] [c c c c]
- % mark B
+ \mark "B";
c1\f
R1*9
f'4.(\p )d8 b4 r8 g
[c ()e g g] [g( f e )d]
c4( % \grace { e}
[d8. )c16] [c8 c--( c-- )c--]
- % mark C
+ \mark "C";
des1\sf %\sfp
g,1\sf %\sfp
c\sf %\sfp
r8 [c c c] c2~
[c8 c' c c] c2~
[c8 e( g f] [e d c bes]
- % mark D
+ \mark "D";
)a4 r r2
R1*3
c4. () f8 a,4 a |
[g()e c-.] [d()e d-.]
c4 r8 r4 r8 |
R2.*7
- % mark A
+ \mark "A";
c4.\p [d8 c d]
c4 r8 r4 r8
e4. [f8 e f]
d2.~
[d8 c b] [b a g]
g'4()e8 b4()cis8
- %mark B
+ \mark "B";
d4 r8 r4 r8
R2.*3 |
r8 [d-. d-.] [d()g d---.]
d4()g8 [c, d e]
[d()g fis] [e d c]
[b () e d] [c b a]
- % mark C
+ \mark "C";
g4 r8 r4 r8
r2. |
%
\rondotheme
R2.*12
r4 r8 r4 c8
- % mark D
+ \mark "D";
c4 f8 c4 a8
a4.~a4 a8
bes4 c8 d4 bes8
bes4. ~ bes4 g8
a4 c8 [f () d b]
d4. () c8 r r
- % mark E
+ \mark "E";
R2.*9 |
\lipbreaker
[c8 c' c] c4.~
r8 [g g] [g g g]
es4.\f~ [es8 d c]
b4. c4. d4. e4.
- % mark F
+ \mark "F";
f2.\f ~ |
f4 r8 r4 r8
r8 [g\> g] [g g g]
[a bes \! b]
\rondotheme
R2.*7
- % mark G
+ \mark "G";
R2.*4
c,4.\mf c4 c8
c4. e4 c8
r4 r8 r4 g'8
[c ()e g,-.] [c ()e g,-.]
[c ()e g,-.] [c ()e g,-.]
- % mark H
+ \mark "H";
g'2._"cresc." bes,2.
a4. [b16 c d e f g]
a4. f4 d8
c4 r8 r4 r8
}
- \include "part-paper.ly"
+\paper{
+ casting_algorithm = \Wordwrap;
+ \translator { \StaffContext \consists Mark_engraver; }
+ \translator { \ScoreContext
+ skipBars = 1;
+ }
+
+}
+
\score
{
\allegro
\score
{
- { \property Score.skipBars = 1
- \romanze
+ { \romanze
}
- \paper{ \tempo 4 = 70; }
- \midi{}
+ \midi{ \tempo 4 = 70; }
+ \paper{}
}
\score
{
\rondo
\paper{
- \tempo 4 = 100;
}
- \midi{}
+ \midi{ \tempo 4 = 100;
+}
}
stroke
} bind def
-/draw_volta % h w thick last
+/draw_volta % h w thick vert_start vert_end
{
- /last exch def
+ /vert_end exch def
+ /vert_start exch def
setlinewidth
/volta_w exch def
/volta_h exch def
% true setstrokeadjust
1 setlinecap
1 setlinejoin
- 0 0 moveto
- 0 volta_h lineto
+ vert_start 0 eq {
+ 0 0 moveto
+ 0 volta_h lineto
+ } if
+ 0 volta_h moveto
volta_w volta_h lineto
- last 0 eq {
+ vert_end 0 eq {
volta_w 0 lineto
} if
stroke
(string-append
"\\lilyfont"
(make-string 1 (integer->char (+ 65 i)))))
-
- (define (select-font font-name)
+
+ (define (select-font font-name magnification)
(if (not (equal? font-name current-font))
(begin
(set! current-font font-name)
(set! font-count (+ 1 font-count))
(if (equal? font-name "")
(error "Empty fontname -- SELECT-FONT"))
- (string-append "\\font" font-cmd "=" font-name font-cmd))
+ (if (> magnification 0)
+ (string-append "\\font" font-cmd "=" font-name
+ " scaled \\magstep "
+ (number->string magnification) font-cmd)
+ (string-append "\\font" font-cmd "=" font-name font-cmd)))
+
(cdr font-cmd)))
"" ;no switch needed
))
(define (dashed-slur thick dash l)
(embedded-ps ((ps-scm 'dashed-slur) thick dash l)))
- (define (crescendo w h cont)
- (embedded-ps ((ps-scm 'crescendo) w h cont)))
+ (define (crescendo thick w h cont)
+ (embedded-ps ((ps-scm 'crescendo) thick w h cont)))
(define (char i)
(string-append "\\char" (inexact->string i 10) " "))
- (define (decrescendo w h cont)
- (embedded-ps ((ps-scm 'decrescendo) w h cont)))
+ (define (decrescendo thick w h cont)
+ (embedded-ps ((ps-scm 'decrescendo) thick w h cont)))
;This sets CTM so that you get to the currentpoint
; by executing a 0 0 moveto
(maxht (* 7 minht))
)
(string-append
- (select-font (string-append "feta-braces" (number->string (inexact->exact staffht))))
+ (select-font (string-append "feta-braces" (number->string (inexact->exact staffht))) 0)
(char (max 0 (/ (- (min y (- maxht step)) minht) step))))
)
)
(define (tuplet ht gapx dx dy thick dir)
(embedded-ps ((ps-scm 'tuplet) ht gapx dx dy thick dir)))
- (define (volta h w thick last)
- (embedded-ps ((ps-scm 'volta) h w thick last)))
+ (define (volta h w thick vert_start vert_end)
+ (embedded-ps ((ps-scm 'volta) h w thick vert_start vert_end)))
;; TeX
;; The procedures listed below form the public interface of TeX-scm.
(string-append
"lilyfont"
(make-string 1 (integer->char (+ 65 i)))))
-
- (define (select-font font-name)
+
+ (define (mag-to-size m)
+ (number->string (case m
+ ('0 12)
+ ('1 12)
+ ('2 14) ; really: 14.400
+ ('3 17) ; really: 17.280
+ ('4 21) ; really: 20.736
+ ('5 24) ; really: 24.888
+ ('6 30) ; really: 29.856
+ )))
+
+ (define (select-font font-name magnification)
(if (not (equal? font-name current-font))
(begin
(set! current-font font-name)
(set! font-alist (acons font-name font-cmd font-alist))
(set! font-count (+ 1 font-count))
(string-append "\n/" font-cmd " {/"
- font-name
- " findfont 12 scalefont setfont} bind def \n"
+ font-name " findfont "
+ (mag-to-size magnification)
+ " scalefont setfont} bind def \n"
font-cmd " \n"))
(string-append (cdr font-cmd) " ")))
; font-name == current-font no switch needed
(define (char i)
(invoke-char " show" i))
- (define (crescendo w h cont thick)
+ (define (crescendo thick w h cont )
(string-append
(numbers->string (list w h (inexact->exact cont) thick))
" draw_crescendo"))
(number->string (* 2 thick))
" ] 0 draw_dashed_slur"))
- (define (decrescendo thick w h cont)
+ (define (decrescendo w h cont thick)
(string-append
(numbers->string (list w h (inexact->exact cont) thick))
" draw_decrescendo"))
(maxht (* 7 minht))
)
(string-append
- (select-font (string-append "feta-braces" (number->string (inexact->exact staffht))))
+ (select-font (string-append "feta-braces" (number->string (inexact->exact staffht))) 0)
(char (max 0 (/ (- (min y (- maxht step)) minht) step))))
)
)
(string-append "(" s ") show "))
- (define (volta h w thick last)
+ (define (volta h w thick vert_start vert_end)
(string-append
- (numbers->string (list h w thick (inexact->exact last)))
+ (numbers->string (list h w thick (inexact->exact vert_start) (inexact->exact vert_end)))
" draw_volta"))
(define (tuplet ht gap dx dy thick dir)
+++ /dev/null
-#!@PYTHON@
-
-# once upon a rainy monday afternoon.
-#
-# ...
-#
-# (not finished.)
-# ABC standard v1.6: http://www.gre.ac.uk/~c.walshaw/abc2mtex/abc.txt
-#
-
-program_name = 'abc-to-ly'
-version = '@TOPLEVEL_VERSION@'
-import __main__
-import getopt
-import sys
-import re
-import string
-try:
- import mpz
-except:
- sys.stderr.write ("This script needs Python 1.5.1\n")
- sys.exit (1)
-
-
-header = {}
-lyrics = []
-voices = []
-global_voice_stuff = []
-default_len = 4
-global_key = [0] * 7 # UGH
-names = ["One", "Two", "Three"]
-DIGITS='0123456789'
-HSPACE=' \t'
-
-def gcd (a, b):
- while a % b:
- a,b = b, a % b
- return b
-
-class Rational:
- def __init__ (self, n, d = 1):
- self.num = n
- self.den = d
-
- def simplify (self):
- g = gcd (self.num, self.den)
- self.num = self.num / g
- self.den = self.den /g
- if self.den < 0:
- self.den = - self.den
- self.num = - self.num
-
- def __sub__ (self, other):
- pass
-
-
-def dump_global ():
- print ("global = \\notes{")
- for i in global_voice_stuff:
- print (i);
- print ("}")
-
-
-def dump_header (hdr):
- print '\\header {'
- for k in hdr.keys ():
- print '%s = "%s";\n'% (k,hdr[k])
- print '}'
-
-def dump_lyrics ():
- for i in range (len (lyrics)):
- print ("verse%s = \\lyrics {" % names [i])
- print (lyrics [i])
- print ("}")
-
-def dump_voices ():
- for i in range (len (voices)):
- print ("voice%s = \\notes {" % names [i])
- print (voices [i])
- print ("}")
-
-def dump_score ():
- print ("\\score{")
- print (" \\notes<")
- print (" \\global")
- for i in range (len (voices)):
- print (" \\context Staff=%s \\voice%s" %
- (names [i], names [i]))
- for i in range (len (lyrics)):
- j = i
- if j >= len (voices):
- j = len (voices) - 1
- print (" \\context Lyrics=%s \\rhythm \\voice%s \\verse%s" %
- (names [i], names [j], names [i]))
- print (" >")
- dump_header (header)
- #print "%%%s" % global_voice_stuff, 1
- print ("}")
-
-def set_default_length (s):
- m = re.search ('1/([0-9]+)', s)
- if m:
- __main__.default_len = string.atoi ( m.group (1))
-
-def gulp_file(f):
- try:
- i = open(f)
- i.seek (0, 2)
- n = i.tell ()
- i.seek (0,0)
- except:
- sys.stderr.write ("can't open file: %s\n" % f)
- return ''
- s = i.read (n)
- if len (s) <= 0:
- sys.stderr.write ("gulped emty file: %s\n" % f)
- i.close ()
- return s
-
-
-# pitch manipulation. Tuples are (name, alteration).
-# 0 is (central) C. Alteration -1 is a flat, Alteration +1 is a sharp
-# pitch in semitones.
-def semitone_pitch (tup):
- p =0
-
- t = tup[0]
- p = p + 12 * (t / 7)
- t = t % 7
-
- if t > 2:
- p = p- 1
-
- p = p + t* 2 + tup[1]
- return p
-
-def fifth_above_pitch (tup):
- (n, a) = (tup[0] + 4, tup[1])
-
- difference = 7 - (semitone_pitch ((n,a)) - semitone_pitch (tup))
- a = a + difference
-
- return (n,a)
-
-def sharp_keys ():
- p = (0,0)
- l = []
- k = 0
- while 1:
- l.append (p)
- (t,a) = fifth_above_pitch (p)
- if semitone_pitch((t,a)) % 12 == 0:
- break
-
- p = (t % 7, a)
- return l
-
-def flat_keys ():
- p = (0,0)
- l = []
- k = 0
- while 1:
- l.append (p)
- (t,a) = quart_above_pitch (p)
- if semitone_pitch((t,a)) % 12 == 0:
- break
-
- p = (t % 7, a)
- return l
-
-def quart_above_pitch (tup):
- (n, a) = (tup[0] + 3, tup[1])
-
- difference = 5 - (semitone_pitch ((n,a)) - semitone_pitch (tup))
- a = a + difference
-
- return (n,a)
-
-
-def compute_key (k):
- k = string.lower (k)
- intkey = (ord (k[0]) - ord('a') + 5) % 7
- intkeyacc =0
- k = k[1:]
-
- if k and k[0] == 'b':
- intkeyacc = -1
- k = k[1:]
- elif k and k[0] == '#':
- intkeyacc = 1
- k = k[1:]
-
- keytup = (intkey, intkeyacc)
-
- sharp_key_seq = sharp_keys ()
- flat_key_seq = flat_keys ()
-
- accseq = None
- accsign = 0
- if keytup in sharp_key_seq:
- accsign = 1
- key_count = sharp_key_seq.index (keytup)
- accseq = map (lambda x: (4*x -1 ) % 7, range (1, key_count + 1))
-
- elif keytup in flat_key_seq:
- accsign = -1
- key_count = flat_key_seq.index (keytup)
- accseq = map (lambda x: (3*x + 3 ) % 7, range (1, key_count + 1))
- else:
- raise "Huh"
-
- key_table = [0] * 7
- for a in accseq:
- key_table[a] = key_table[a] + accsign
-
-
- return key_table
-
-tup_lookup = {
- '3' : '2/3',
- '4' : '4/3',
- '5' : '4/5',
- '6' : '4/6',
- }
-
-
-def try_parse_tuplet_begin (str, state):
- if str and str[0] in DIGITS:
- dig = str[0]
- str = str[1:]
- state.parsing_tuplet = 1
-
- voices_append ("\\times %s {" % tup_lookup[dig])
- return str
-
-def try_parse_group_end (str, state):
- if str and str[0] in HSPACE:
- str = str[1:]
- if state.parsing_tuplet:
- state.parsing_tuplet = 0
- voices_append ("}")
- return str
-
-def header_append (key, a):
- s = ''
- if header.has_key (key):
- s = header[key] + "\n"
- header [key] = s + a
-
-def lyrics_append (a):
- i = len (lyrics) - 1
- if i < 0:
- i = 0
- if len (lyrics) <= i:
- lyrics.append ('')
- lyrics [i] = lyrics [i] + a + "\n"
-
-def voices_append (a):
- i = len (voices) - 1
- if i < 0:
- i = 0
- if len (voices) <= i:
- voices.append ('')
- voices [i] = voices [i] + a + "\n"
-
-def try_parse_header_line (ln):
- m = re.match ('^(.): *(.*)$', ln)
-
- if m:
- g =m.group (1)
- a = m.group (2)
- a = re.sub ('"', '\\"', a)
- if g == 'T':
- header['title'] = a
- if g == 'M':
- if a == 'C':
- a = '4/4'
- global_voice_stuff.append ('\\time %s;' % a)
- if g == 'K':
- __main__.global_key =compute_key (a)# ugh.
-
- global_voice_stuff.append ('\\key %s;' % a)
- if g == 'O':
- header ['origin'] = a
- if g == 'X':
- header ['crossRefNumber'] = a
- if g == 'A':
- header ['area'] = a
- if g == 'H':
- header_append ('history', a)
- if g == 'B':
- header ['book'] = a
- if g == 'S':
- header ['subtitle'] = a
- if g == 'L':
- set_default_length (ln)
- if g == 'W':
- if not len (a):
- lyrics.append ('')
- else:
- lyrics_append (a);
- return m
-
-def pitch_to_mudela_name (name, acc):
- s = ''
- if acc < 0:
- s = 'es'
- acc = -acc
- elif acc > 0:
- s = 'is'
-
- if name > 4:
- name = name -7
- return chr (name + ord('c')) + s * acc
-
-def octave_to_mudela_quotes (o):
- o = o + 2
- s =''
- if o < 0:
- o = -o
- s=','
- else:
- s ='\''
-
- return s * o
-
-def parse_num (str):
- durstr = ''
- while str and str[0] in DIGITS:
- durstr = durstr + str[0]
- str = str[1:]
-
- n = None
- if durstr:
- n =string.atoi (durstr)
- return (str,n)
-
-
-def duration_to_mudela_duration (multiply_tup, defaultlen, dots):
- base = 1
-
- # (num / den) / defaultlen < 1/base
- while base * multiply_tup[0] < defaultlen * multiply_tup[1]:
- base = base * 2
-
-
- return '%d%s' % ( base, '.'* dots)
-
-class Parser_state:
- def __init__ (self):
- self.next_dots = 0
- self.next_den = 1
- self.parsing_tuplet = 0
-
-
-# WAT IS ABC EEN ONTZETTENDE PROGRAMMEERPOEP !
-def try_parse_note (str, parser_state):
- mud = ''
-
- slur_begin =0
- if not str:
- return str
-
- if str[0] == '(':
- slur_begin = 1
- str = str[1:]
-
- acc = 0
- if str[0] in '^=_':
- c = str[0]
- str = str[1:]
- if c == '^':
- acc = 1
- if c == '=':
- acc = 0
- if c == '_':
- acc = -1
-
- octave = 0;
- if str[0] in "ABCDEFG":
- str = string.lower (str[0]) + str[1:]
- octave = -1
-
-
- notename = 0
- if str[0] in "abcdefg":
- notename = (ord(str[0]) - ord('a') + 5)%7
- str = str[1:]
- else:
- return str # failed; not a note!
-
- while str[0] == ',':
- octave = octave - 1
- str = str[1:]
- while str[0] == '\'':
- octave = octave + 1
- str = str[1:]
-
- num = 0
- den = parser_state.next_den
- parser_state.next_den = 1
-
- (str, num) = parse_num (str)
- if not num:
- num = 1
-
- if str[0] == '/':
- while str[0] == '/':
- str= str[1:]
- d = 2
- if str[0] in DIGITS:
- (str, d) =parse_num (str)
-
- den = den * d
-
- current_dots = parser_state.next_dots
- parser_state.next_dots = 0
- while str[0] == '>':
- str = str [1:]
- current_dots = current_dots + 1;
- parser_state.next_den = parser_state.next_den * 2
-
- while str[0] == '<':
- str = str [1:]
- den = den * 2
- parser_state.next_dots = parser_state.next_dots + 1
-
-
-
- voices_append ("%s%s%s" %
- (pitch_to_mudela_name (notename, acc + global_key[notename]),
- octave_to_mudela_quotes (octave),
- duration_to_mudela_duration ((num,den), default_len, current_dots)))
- slur_end =0
- if str[0] == ')':
- slur_begin = 1
- str = str[1:]
-
-
- return str
-
-def junk_space (str):
- while str and str[0] in '\t\n ':
- str = str[1:]
-
- return str
-
-
-def try_parse_guitar_chord (str):
- if str and str[0] == '"':
- str = str[1:]
- gc = ''
- while str and str[0] != '"':
- gc = gc + str[0]
- str = str[1:]
-
- if str:
- str = str[1:]
-
- sys.stderr.write ("warning: ignoring guitar chord: %s\n" % gc)
-
- return str
-
-def try_parse_escape (str):
- if not str or str [0] != '\\':
- return str
-
- str = str[1:]
- if str and str[0] == 'K':
- key_table = compute_key ()
-
- return str
-
-#
-# |] thin-thick double bar line
-# || thin-thin double bar line
-# [| thick-thin double bar line
-# :| left repeat
-# |: right repeat
-# :: left-right repeat
-#
-
-def try_parse_bar (str):
- if str and str[0] == '|':
- bs = ''
- str = str[1:]
- if str:
- if str[0] == ']':
- bs = '|.'
- if str[0] == '|':
- bs = '||'
- if str[0] == '|:':
- sys.stderr.write ("warning: repeat kludge\n")
- bs = '|:'
- if bs:
- voices_append ('\\bar "%s";' % bs)
- str = str[1:]
-
- if str and str[:2] == '[|':
- sys.stderr.write ("warning: thick-thin bar kludge\n")
- voices_append ('\\bar "||";')
- str = str[2:]
-
- if str and str[:2] == ':|':
- sys.stderr.write ("warning: repeat kludge\n")
- voices_append ('\\bar ":|:";')
- str = str[2:]
-
- if str and str[:2] == '::':
- sys.stderr.write ("warning: repeat kludge\n")
- voices_append ('\\bar ":|:";')
- str = str[2:]
-
- return str
-
-
-def try_parse_chord_delims (str):
- if str and str[0] == '[':
- str = str[1:]
- voices_append ('<')
-
- if str and str[0] == ']':
- str = str[1:]
- voices_append ('>')
-
- return str
-
-# urg, hairy to compute grace note hack using \times{}
-def try_parse_grace_delims (str):
- if str and str[0] == '{':
- str = str[1:]
- voices_append ('\\grace { ')
-
- if str and str[0] == '}':
- str = str[1:]
- voices_append ('}')
-
- return str
-
-# Try nibbling characters off until the line doesn't change.
-def try_parse_body_line (ln, state):
- prev_ln = ''
- while ln != prev_ln:
- prev_ln = ln
- ln = try_parse_chord_delims (ln)
- ln = try_parse_note (ln, state)
- ln = try_parse_bar (ln)
- ln = try_parse_escape (ln)
- ln = try_parse_guitar_chord (ln)
- ln = try_parse_tuplet_begin (ln, state)
- ln = try_parse_group_end (ln, state)
- ln = try_parse_grace_delims (ln)
- ln = junk_space (ln)
-
- if ln:
- sys.stderr.write ("Huh? Don't understand `%s'\n" % ln)
-
-
-
-def parse_file (fn):
- f = open (fn)
- ls = f.readlines ()
-
- head = 1
- state = Parser_state ()
- for l in ls:
- if re.match ('^[\t ]*(%.*)?$', l):
- continue
-
- if head:
- m = try_parse_header_line (l)
- if not m:
- head = 0
-
- if not head:
- m = try_parse_body_line (l,state)
-
-
-def identify():
- sys.stderr.write ("%s from LilyPond %s\n" % (program_name, version))
-
-def help ():
- print r"""
-This is a disfunctional ABC to mudela convertor. It only gulps input, and
-says huh when confused. Go ahead and fix me.
-
-Usage: abc-2-ly INPUTFILE
-
--h, --help this help.
-"""
-
-
-
-identify()
-(options, files) = getopt.getopt (sys.argv[1:], 'h', ['help'])
-
-for opt in options:
- o = opt[0]
- a = opt[1]
- if o== '--help' or o == '-h':
- help ()
- else:
- print o
- raise getopt.error
-
-
-for f in files:
- if f == '-':
- f = ''
- parse_file (f)
-
- dump_global ()
- dump_lyrics ()
- dump_voices ()
- dump_score ()
-
-
--- /dev/null
+#!@PYTHON@
+
+# once upon a rainy monday afternoon.
+#
+# ...
+#
+# (not finished.)
+# ABC standard v1.6: http://www.gre.ac.uk/~c.walshaw/abc2mtex/abc.txt
+#
+
+program_name = 'abc-to-ly'
+version = '@TOPLEVEL_VERSION@'
+import __main__
+import getopt
+import sys
+import re
+import string
+try:
+ import mpz
+except:
+ sys.stderr.write ("This script needs Python 1.5.1\n")
+ sys.exit (1)
+
+
+header = {}
+lyrics = []
+voices = []
+global_voice_stuff = []
+default_len = 4
+global_key = [0] * 7 # UGH
+names = ["One", "Two", "Three"]
+DIGITS='0123456789'
+HSPACE=' \t'
+
+def gcd (a, b):
+ while a % b:
+ a,b = b, a % b
+ return b
+
+class Rational:
+ def __init__ (self, n, d = 1):
+ self.num = n
+ self.den = d
+
+ def simplify (self):
+ g = gcd (self.num, self.den)
+ self.num = self.num / g
+ self.den = self.den /g
+ if self.den < 0:
+ self.den = - self.den
+ self.num = - self.num
+
+ def __sub__ (self, other):
+ pass
+
+
+def dump_global ():
+ print ("global = \\notes{")
+ for i in global_voice_stuff:
+ print (i);
+ print ("}")
+
+
+def dump_header (hdr):
+ print '\\header {'
+ for k in hdr.keys ():
+ print '%s = "%s";\n'% (k,hdr[k])
+ print '}'
+
+def dump_lyrics ():
+ for i in range (len (lyrics)):
+ print ("verse%s = \\lyrics {" % names [i])
+ print (lyrics [i])
+ print ("}")
+
+def dump_voices ():
+ for i in range (len (voices)):
+ print ("voice%s = \\notes {" % names [i])
+ print (voices [i])
+ print ("}")
+
+def dump_score ():
+ print ("\\score{")
+ print (" \\notes<")
+ print (" \\global")
+ for i in range (len (voices)):
+ print (" \\context Staff=%s \\voice%s" %
+ (names [i], names [i]))
+ for i in range (len (lyrics)):
+ j = i
+ if j >= len (voices):
+ j = len (voices) - 1
+ print (" \\context Lyrics=%s \\rhythm \\voice%s \\verse%s" %
+ (names [i], names [j], names [i]))
+ print (" >")
+ dump_header (header)
+ #print "%%%s" % global_voice_stuff, 1
+ print ("}")
+
+def set_default_length (s):
+ m = re.search ('1/([0-9]+)', s)
+ if m:
+ __main__.default_len = string.atoi ( m.group (1))
+
+def gulp_file(f):
+ try:
+ i = open(f)
+ i.seek (0, 2)
+ n = i.tell ()
+ i.seek (0,0)
+ except:
+ sys.stderr.write ("can't open file: %s\n" % f)
+ return ''
+ s = i.read (n)
+ if len (s) <= 0:
+ sys.stderr.write ("gulped emty file: %s\n" % f)
+ i.close ()
+ return s
+
+
+# pitch manipulation. Tuples are (name, alteration).
+# 0 is (central) C. Alteration -1 is a flat, Alteration +1 is a sharp
+# pitch in semitones.
+def semitone_pitch (tup):
+ p =0
+
+ t = tup[0]
+ p = p + 12 * (t / 7)
+ t = t % 7
+
+ if t > 2:
+ p = p- 1
+
+ p = p + t* 2 + tup[1]
+ return p
+
+def fifth_above_pitch (tup):
+ (n, a) = (tup[0] + 4, tup[1])
+
+ difference = 7 - (semitone_pitch ((n,a)) - semitone_pitch (tup))
+ a = a + difference
+
+ return (n,a)
+
+def sharp_keys ():
+ p = (0,0)
+ l = []
+ k = 0
+ while 1:
+ l.append (p)
+ (t,a) = fifth_above_pitch (p)
+ if semitone_pitch((t,a)) % 12 == 0:
+ break
+
+ p = (t % 7, a)
+ return l
+
+def flat_keys ():
+ p = (0,0)
+ l = []
+ k = 0
+ while 1:
+ l.append (p)
+ (t,a) = quart_above_pitch (p)
+ if semitone_pitch((t,a)) % 12 == 0:
+ break
+
+ p = (t % 7, a)
+ return l
+
+def quart_above_pitch (tup):
+ (n, a) = (tup[0] + 3, tup[1])
+
+ difference = 5 - (semitone_pitch ((n,a)) - semitone_pitch (tup))
+ a = a + difference
+
+ return (n,a)
+
+
+def compute_key (k):
+ k = string.lower (k)
+ intkey = (ord (k[0]) - ord('a') + 5) % 7
+ intkeyacc =0
+ k = k[1:]
+
+ if k and k[0] == 'b':
+ intkeyacc = -1
+ k = k[1:]
+ elif k and k[0] == '#':
+ intkeyacc = 1
+ k = k[1:]
+
+ keytup = (intkey, intkeyacc)
+
+ sharp_key_seq = sharp_keys ()
+ flat_key_seq = flat_keys ()
+
+ accseq = None
+ accsign = 0
+ if keytup in sharp_key_seq:
+ accsign = 1
+ key_count = sharp_key_seq.index (keytup)
+ accseq = map (lambda x: (4*x -1 ) % 7, range (1, key_count + 1))
+
+ elif keytup in flat_key_seq:
+ accsign = -1
+ key_count = flat_key_seq.index (keytup)
+ accseq = map (lambda x: (3*x + 3 ) % 7, range (1, key_count + 1))
+ else:
+ raise "Huh"
+
+ key_table = [0] * 7
+ for a in accseq:
+ key_table[a] = key_table[a] + accsign
+
+
+ return key_table
+
+tup_lookup = {
+ '3' : '2/3',
+ '4' : '4/3',
+ '5' : '4/5',
+ '6' : '4/6',
+ }
+
+
+def try_parse_tuplet_begin (str, state):
+ if str and str[0] in DIGITS:
+ dig = str[0]
+ str = str[1:]
+ state.parsing_tuplet = 1
+
+ voices_append ("\\times %s {" % tup_lookup[dig])
+ return str
+
+def try_parse_group_end (str, state):
+ if str and str[0] in HSPACE:
+ str = str[1:]
+ if state.parsing_tuplet:
+ state.parsing_tuplet = 0
+ voices_append ("}")
+ return str
+
+def header_append (key, a):
+ s = ''
+ if header.has_key (key):
+ s = header[key] + "\n"
+ header [key] = s + a
+
+def lyrics_append (a):
+ i = len (lyrics) - 1
+ if i < 0:
+ i = 0
+ if len (lyrics) <= i:
+ lyrics.append ('')
+ lyrics [i] = lyrics [i] + a + "\n"
+
+def voices_append (a):
+ i = len (voices) - 1
+ if i < 0:
+ i = 0
+ if len (voices) <= i:
+ voices.append ('')
+ voices [i] = voices [i] + a + "\n"
+
+def try_parse_header_line (ln):
+ m = re.match ('^(.): *(.*)$', ln)
+
+ if m:
+ g =m.group (1)
+ a = m.group (2)
+ a = re.sub ('"', '\\"', a)
+ if g == 'T':
+ header['title'] = a
+ if g == 'M':
+ if a == 'C':
+ a = '4/4'
+ global_voice_stuff.append ('\\time %s;' % a)
+ if g == 'K':
+ __main__.global_key =compute_key (a)# ugh.
+
+ global_voice_stuff.append ('\\key %s;' % a)
+ if g == 'O':
+ header ['origin'] = a
+ if g == 'X':
+ header ['crossRefNumber'] = a
+ if g == 'A':
+ header ['area'] = a
+ if g == 'H':
+ header_append ('history', a)
+ if g == 'B':
+ header ['book'] = a
+ if g == 'S':
+ header ['subtitle'] = a
+ if g == 'L':
+ set_default_length (ln)
+ if g == 'W':
+ if not len (a):
+ lyrics.append ('')
+ else:
+ lyrics_append (a);
+ return m
+
+def pitch_to_mudela_name (name, acc):
+ s = ''
+ if acc < 0:
+ s = 'es'
+ acc = -acc
+ elif acc > 0:
+ s = 'is'
+
+ if name > 4:
+ name = name -7
+ return chr (name + ord('c')) + s * acc
+
+def octave_to_mudela_quotes (o):
+ o = o + 2
+ s =''
+ if o < 0:
+ o = -o
+ s=','
+ else:
+ s ='\''
+
+ return s * o
+
+def parse_num (str):
+ durstr = ''
+ while str and str[0] in DIGITS:
+ durstr = durstr + str[0]
+ str = str[1:]
+
+ n = None
+ if durstr:
+ n =string.atoi (durstr)
+ return (str,n)
+
+
+def duration_to_mudela_duration (multiply_tup, defaultlen, dots):
+ base = 1
+
+ # (num / den) / defaultlen < 1/base
+ while base * multiply_tup[0] < defaultlen * multiply_tup[1]:
+ base = base * 2
+
+
+ return '%d%s' % ( base, '.'* dots)
+
+class Parser_state:
+ def __init__ (self):
+ self.next_dots = 0
+ self.next_den = 1
+ self.parsing_tuplet = 0
+
+
+# WAT IS ABC EEN ONTZETTENDE PROGRAMMEERPOEP !
+def try_parse_note (str, parser_state):
+ mud = ''
+
+ slur_begin =0
+ if not str:
+ return str
+
+ if str[0] == '(':
+ slur_begin = 1
+ str = str[1:]
+
+ acc = 0
+ if str[0] in '^=_':
+ c = str[0]
+ str = str[1:]
+ if c == '^':
+ acc = 1
+ if c == '=':
+ acc = 0
+ if c == '_':
+ acc = -1
+
+ octave = 0;
+ if str[0] in "ABCDEFG":
+ str = string.lower (str[0]) + str[1:]
+ octave = -1
+
+
+ notename = 0
+ if str[0] in "abcdefg":
+ notename = (ord(str[0]) - ord('a') + 5)%7
+ str = str[1:]
+ else:
+ return str # failed; not a note!
+
+ while str[0] == ',':
+ octave = octave - 1
+ str = str[1:]
+ while str[0] == '\'':
+ octave = octave + 1
+ str = str[1:]
+
+ num = 0
+ den = parser_state.next_den
+ parser_state.next_den = 1
+
+ (str, num) = parse_num (str)
+ if not num:
+ num = 1
+
+ if str[0] == '/':
+ while str[0] == '/':
+ str= str[1:]
+ d = 2
+ if str[0] in DIGITS:
+ (str, d) =parse_num (str)
+
+ den = den * d
+
+ current_dots = parser_state.next_dots
+ parser_state.next_dots = 0
+ while str[0] == '>':
+ str = str [1:]
+ current_dots = current_dots + 1;
+ parser_state.next_den = parser_state.next_den * 2
+
+ while str[0] == '<':
+ str = str [1:]
+ den = den * 2
+ parser_state.next_dots = parser_state.next_dots + 1
+
+
+
+ voices_append ("%s%s%s" %
+ (pitch_to_mudela_name (notename, acc + global_key[notename]),
+ octave_to_mudela_quotes (octave),
+ duration_to_mudela_duration ((num,den), default_len, current_dots)))
+ slur_end =0
+ if str[0] == ')':
+ slur_begin = 1
+ str = str[1:]
+
+
+ return str
+
+def junk_space (str):
+ while str and str[0] in '\t\n ':
+ str = str[1:]
+
+ return str
+
+
+def try_parse_guitar_chord (str):
+ if str and str[0] == '"':
+ str = str[1:]
+ gc = ''
+ while str and str[0] != '"':
+ gc = gc + str[0]
+ str = str[1:]
+
+ if str:
+ str = str[1:]
+
+ sys.stderr.write ("warning: ignoring guitar chord: %s\n" % gc)
+
+ return str
+
+def try_parse_escape (str):
+ if not str or str [0] != '\\':
+ return str
+
+ str = str[1:]
+ if str and str[0] == 'K':
+ key_table = compute_key ()
+
+ return str
+
+#
+# |] thin-thick double bar line
+# || thin-thin double bar line
+# [| thick-thin double bar line
+# :| left repeat
+# |: right repeat
+# :: left-right repeat
+#
+
+def try_parse_bar (str):
+ if str and str[0] == '|':
+ bs = ''
+ str = str[1:]
+ if str:
+ if str[0] == ']':
+ bs = '|.'
+ if str[0] == '|':
+ bs = '||'
+ if str[0] == '|:':
+ sys.stderr.write ("warning: repeat kludge\n")
+ bs = '|:'
+ if bs:
+ voices_append ('\\bar "%s";' % bs)
+ str = str[1:]
+
+ if str and str[:2] == '[|':
+ sys.stderr.write ("warning: thick-thin bar kludge\n")
+ voices_append ('\\bar "||";')
+ str = str[2:]
+
+ if str and str[:2] == ':|':
+ sys.stderr.write ("warning: repeat kludge\n")
+ voices_append ('\\bar ":|:";')
+ str = str[2:]
+
+ if str and str[:2] == '::':
+ sys.stderr.write ("warning: repeat kludge\n")
+ voices_append ('\\bar ":|:";')
+ str = str[2:]
+
+ return str
+
+
+def try_parse_chord_delims (str):
+ if str and str[0] == '[':
+ str = str[1:]
+ voices_append ('<')
+
+ if str and str[0] == ']':
+ str = str[1:]
+ voices_append ('>')
+
+ return str
+
+# urg, hairy to compute grace note hack using \times{}
+def try_parse_grace_delims (str):
+ if str and str[0] == '{':
+ str = str[1:]
+ voices_append ('\\grace { ')
+
+ if str and str[0] == '}':
+ str = str[1:]
+ voices_append ('}')
+
+ return str
+
+# Try nibbling characters off until the line doesn't change.
+def try_parse_body_line (ln, state):
+ prev_ln = ''
+ while ln != prev_ln:
+ prev_ln = ln
+ ln = try_parse_chord_delims (ln)
+ ln = try_parse_note (ln, state)
+ ln = try_parse_bar (ln)
+ ln = try_parse_escape (ln)
+ ln = try_parse_guitar_chord (ln)
+ ln = try_parse_tuplet_begin (ln, state)
+ ln = try_parse_group_end (ln, state)
+ ln = try_parse_grace_delims (ln)
+ ln = junk_space (ln)
+
+ if ln:
+ sys.stderr.write ("Huh? Don't understand `%s'\n" % ln)
+
+
+
+def parse_file (fn):
+ f = open (fn)
+ ls = f.readlines ()
+
+ head = 1
+ state = Parser_state ()
+ for l in ls:
+ if re.match ('^[\t ]*(%.*)?$', l):
+ continue
+
+ if head:
+ m = try_parse_header_line (l)
+ if not m:
+ head = 0
+
+ if not head:
+ m = try_parse_body_line (l,state)
+
+
+def identify():
+ sys.stderr.write ("%s from LilyPond %s\n" % (program_name, version))
+
+def help ():
+ print r"""
+This is a disfunctional ABC to mudela convertor. It only gulps input, and
+says huh when confused. Go ahead and fix me.
+
+Usage: abc-2-ly INPUTFILE
+
+-h, --help this help.
+"""
+
+
+
+identify()
+(options, files) = getopt.getopt (sys.argv[1:], 'h', ['help'])
+
+for opt in options:
+ o = opt[0]
+ a = opt[1]
+ if o== '--help' or o == '-h':
+ help ()
+ else:
+ print o
+ raise getopt.error
+
+
+for f in files:
+ if f == '-':
+ f = ''
+ parse_file (f)
+
+ dump_global ()
+ dump_lyrics ()
+ dump_voices ()
+ dump_score ()
+
+
'\\wheel -> \\coda')
-if 1:
- def conv(lines):
- newlines =[]
- for x in lines:
- x = re.sub ('\\\\wheel','\\\\coda', x)
- newlines.append (x)
- return newlines
-
- conversions.append ((1,1,55), conv,
- '\\wheel -> \\coda')
-
-
-
############################
do_deps = 1
elif o == '--default-mudela-fontsize':
if not fontsize_pt2i.has_key(a):
- sys.stderr.write("Error: illegal fontsize: %s" % a)
+ sys.stderr.write("Error: invalid fontsize: %s" % a)
sys.stderr.write(" accepted fontsizes are: 11pt, 13pt, 16pt, 20pt, 26pt")
sys.exit()
Props.setMudelaFontsize(fontsize_pt2i[a], 'init')
elif o == '--force-mudela-fontsize':
if not fontsize_pt2i.has_key(a):
- sys.stderr.write("Error: illegal fontsize: %s" % a)
+ sys.stderr.write("Error: invalid fontsize: %s" % a)
sys.stderr.write(" accepted fontsizes are: 11pt, 13pt, 16pt, 20pt, 26pt")
sys.exit()
Props.force_mudela_fontsize = fontsize_pt2i[a]
$(YODL2TEXINFO) -doutdir=$(outdir) --live-data=3 -o $@ $<
$(outdir)/%.txt: %.yo
- $(YODL2TXT) -doutdir=$(outdir) --live-data=3 -o $@ $<
-# $(YODL2MSLESS) -doutdir=$(outdir) --live-data=3 $< > $@
+# $(YODL2TXT) -doutdir=$(outdir) --live-data=3 -o $@ $<
+ $(YODL2MSLESS) -doutdir=$(outdir) --live-data=3 $< > $@
# rm -f $(basename $<).ms
+++ /dev/null
-% fetdefs.tex
-% encapsulating tex backend for auto-generated feta definitions
-\endinput
\message{LaTeX definitions}
\def\texsuffix{LaTeX}
-
-\def\cmrelevenLaTeX{
- \def\settext##1{{\normalfont\tiny ##1}}
- \def\setitalic##1{\textit{\tiny ##1}}
- \def\setbold##1{\textbf{\tiny ##1}}
- \def\setlarge##1{\textbf{\footnotesize ##1}}
- \def\setLarge##1{\textbf{\small ##1}}
- \def\sethuge##1{\textbf{\normalsize ##1}}
-}
-\def\cmrthirteenLaTeX{
- \def\settext##1{{\normalfont\scriptsize ##1}}
- \def\setitalic##1{\textit{\scriptsize ##1}}
- \def\setbold##1{\textbf{\scriptsize ##1}}
- \def\setlarge##1{\textbf{\small ##1}}
- \def\setLarge##1{\textbf{\normalsize ##1}}
- \def\sethuge##1{\textbf{\large ##1}}
-}
-\def\cmrsixteenLaTeX{
- \def\settext##1{{\normalfont\footnotesize ##1}}
- \def\setitalic##1{\textit{\small ##1}}
- \def\setbold##1{\textbf{\footnotesize ##1}}
- \def\settypewriter##1{\texttt{\normalsize ##1}}
- \def\setlarge##1{\textbf{\normalsize ##1}}
- \def\setLarge##1{\textbf{\large ##1}}
- \def\sethuge##1{\textbf{\Large ##1}}
-}
-\def\cmrtwentyLaTeX{
- \def\settext##1{{\normalfont ##1}}
- \def\setitalic##1{\textit{\normalsize ##1}}
- \def\setbold##1{\textbf{\normalsize ##1}}
- \def\settypewriter##1{\texttt{\normalsize ##1}}
- \def\setlarge##1{\textbf{\large ##1}}
- \def\setLarge##1{\textbf{\Large ##1}}
- \def\sethuge##1{\textbf{\huge ##1}}
-}
-
-%%%%%%%%UGH
- \def\settext#1{{\normalfont #1}}
- \def\setitalic#1{\textit{\normalsize #1}}
- \def\setbold#1{\textbf{\normalsize #1}}
- \def\settypewriter#1{\texttt{\normalsize #1}}
- \def\setlarge#1{\textbf{\large #1}}
- \def\setLarge#1{\textbf{\Large #1}}
- \def\sethuge#1{\textbf{\huge #1}}
-
-
\def\lilyfooterLaTeX{
\let\nopagenumbers\relax
%% FIXME
\message{LilyPond Plain TeX settings}
\def\texsuffix{PlainTeX}
-\def\cmrtwentyPlainTeX{
- \font\normaltextfont=cmr10 %\textfont is a primitive
- \font\italicfont=cmti10 scaled \magstep1
- \font\boldfont=cmbx10
- \font\largefont=cmbx12
- \font\typewriterfont=cmtt10
- \font\Largefont=cmbx12 scaled \magstep 2
- \font\hugefont=cmbx12 scaled \magstep 3
-}
-\def\cmrsixteenPlainTeX{
- \font\normaltextfont=cmr8 %\textfont is a primitive
- \font\italicfont=cmti9
- \font\boldfont=cmbx8
- \font\typewriterfont=cmtt9
- \font\largefont=cmbx10
- \font\Largefont=cmbx12
- \font\hugefont=cmbx12 scaled \magstep 2
-}
-\def\cmrthirteenPlainTeX{
- \font\normaltextfont=cmr7
- \font\italicfont=cmti7
- \font\boldfont=cmbx7
- \font\largefont=cmbx9
- \font\typewriterfont=cmtt7
- \font\Largefont=cmbx10
- \font\hugefont=cmbx12
-}
-
-\def\cmrelevenPlainTeX{
- \font\normaltextfont=cmr6
- \font\italicfont=cmti6
- \font\boldfont=cmbx6
- \font\typewriterfont=cmtt6
- \font\largefont=cmbx8
- \font\Largefont=cmbx9
- \font\hugefont=cmbx10
-}
-
\def\lilyfooterPlainTeX{
\footline={\ifnum\pageno=1\smalltextfont\mudelacopyright\hfil \mudelatagline
\else\hfil\the\pageno\hfil\fi}%
}
\advance\hoffset by -.6in
-
-
-\def\settext#1{\normaltextfont #1}
-\def\setitalic#1{\italicfont #1}
-\def\setbold#1{\boldfont #1}
-\def\settypewriter#1{\typewriterfont #1}
-\def\setlarge#1{\largefont #1}
-\def\setLarge#1{\Largefont #1}
-\def\sethuge#1{\hugefont #1}
-
-\def\nolilyfooterPlainTeX{\nopagenumbers
-}
+\def\nolilyfooterPlainTeX{\nopagenumbers}
\def\SkipLilydefs{}
\fi
\SkipLilydefs
+
+% need to do some stuff to turn pagenumbering off
+\ifundefined{documentclass}
+ \input lilypond-plaintex
+\else
+ \input lilypond-latex
+\fi
+
+
%
\def\botalign#1{\vbox to 0pt{\vss #1}}
\def\leftalign#1{\hbox to 0pt{#1\hss}}
+\font\textmusic=cmmi10
+\def\textsharp{\raise.4ex\hbox{\textmusic\char"5D}}
+\def\textnatural{\raise.4ex\hbox{\textmusic\char"5C}}
+\def\textflat{\raise.2ex\hbox{\textmusic\char"5B}}
+
+
% stacked horizontal lines
\input lily-ps-defs
\def\EndLilyPondOutput{%
\csname bye\endcsname
- }
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
+}
\def\postheader{}
-\noindent
+
+% need to do some stuff to turn pagenumbering off
+% they seriously mess up your fragments.
+
+\ifx\csname nolilyfooter\endcsname\relax
+ \message{[footer defined]}%
+ \csname lilyfooter\texsuffix\endcsname%
+\else
+ \message{[footer empty]}
+ \csname%
+ nolilyfooter\texsuffix\endcsname
+\fi
+
+
+\endinput
% ful of pars, needs the above
\input lilyponddefs
+
+% generates par
+\def\interscoreline{}
% generates par
\musixsixteendefs
\def\musixsixteendefs{}
-% generates par
-\turnOnPostScript%
-\def\turnOnPostScript{}
-% generates par
-\def\interscoreline{}
\def\nolilyfooter{}
+%urg: missing \begin{document}?
+\def\noindent{}
\parskip\saveparskip
{\center{\large\theinstrument}\par}
{\flushleft{\large\normalfont\scshape\thepiece}}
- \leavevmode
+% \leavevmode
}
\def\makelilypiecetitle
{