TOPLEVEL_MAJOR_VERSION = 0
TOPLEVEL_MINOR_VERSION = 0
-TOPLEVEL_PATCH_LEVEL = 50
+TOPLEVEL_PATCH_LEVEL = 51
# use to send patches, always empty for released version:
# include separator: ".postfix", "-pl" makes rpm barf
=head1 NAME
-CodingStyle - standards while programming for LilyPond
+CodingStyle - standards while programming for GNU LilyPond
=head1 DESCRIPTION
-Please use these standards while doing programming for LilyPond
+Please use these standards while doing programming for GNU LilyPond
Functions and methods do not return errorcodes, but use assert for
checking status.
=head2 CLASSNAMES (2)
-A lot of classes in LilyPond start with 'P', this is to distinguish
-certain parts of LilyPond: the P stands for Printer, and the P-classes
+A lot of classes in GNU LilyPond start with 'P', this is to distinguish
+certain parts of GNU LilyPond: the P stands for Printer, and the P-classes
are supposed to be more lowlevel than the others. Example:
Staff uses PStaff, PScore and PCol to do the typesetting of
=head1 NAME
-INSTALL - installing LilyPond
+INSTALL - installing GNU LilyPond
=head1 DESCRIPTION
-This page documents installation and compilation of LilyPond
+This page documents installation and compilation of GNU LilyPond
=head1 IMPORTANT
=over 5
=item *
-Unix. LilyPond is known to run on Linux, AIX, Digital Unix and
+Unix. GNU LilyPond is known to run on Linux, AIX, Digital Unix and
Solaris
If you have the Cygnus WIN32 port of the GNU utils, it will
=head1 CONFIGURING and COMPILING
-to install LilyPond, simply type:
+to install GNU LilyPond, simply type:
configure
make install
configure --prefix=/home/me_myself_and_I/
-Since LilyPond currently is beta, You are advised to also use
+Since GNU LilyPond currently is beta, You are advised to also use
--enable-debug
--enable-checking
=head1 RUNNING
-LilyPond does use a lot of resources. For operation you need the following:
+GNU LilyPond does use a lot of resources. For operation you need the following:
=over 5
you need the cygnus win32 gnu port development stuff; have a look
at http://www.cygnus.com/gnu-win32.
-to make LilyPond under, brr, aargh, well, simply type:
+to make GNU LilyPond under, brr, aargh, well, simply type:
bash configure
make win32
=head1 PLATFORMS
-LilyPond (pl 0.0.39) is known to compile on the following platforms:
+GNU LilyPond (pl 0.0.39) is known to compile on the following platforms:
* linux 2.0.28, g++ 2.7.2[.1]
* aix 4.1, g++ 2.7.2
--- /dev/null
+=head1 NAME
+
+MANIFESTO -- Rationale behind the GNU LilyPond project
+
+=head1 DESCRIPTION
+
+
+GNU LilyPond was written with some considerations in mind:
+
+
+=over 4
+
+Describing a well-defined language for defining music. We call
+this language (rather arrogantly) The Musical Definition Language
+(mudela for short). GNU LilyPond reads a mudela sourcefile and outputs a
+TeX file.
+
+=item *
+
+We want to provide an easy-to-use interface for typesetting music in
+its broadest sense. This interface should be intuitive from a musical
+point of view. By broadest sense we mean: it is designed for music
+printed left to right in staffs, using notes to designate rythm and
+pitch.
+
+=item *
+
+Generate high-quality output. Ideally it should be of a professional
+quality. We'd like to render Herbert Chlapiks words, "Fine music
+setting is not possible without a knowledgeable printer," untrue.
+
+=back
+
+=head1 LILYPOND
+
+
+Further considerations while doing the programming
+
+=over 4
+
+=item *
+
+GNU LilyPond uses MusiXTeX fonts and TeX for its output. This is not a key
+issue: in a future version, GNU LilyPond might bypass TeX, but at the moment
+TeX is very convenient for producing output.
+
+
+=item *
+
+GNU LilyPond does not display notes directly, nor will it be rehacked to be
+used interactively. GNU LilyPond writes output to a file. It will not be
+extended to play music, or to recognize music.
+
+=item *
+
+GNU LilyPond is intended to run on Unix platforms, but it should
+be portable to any platform which can run TeX and the GNU tools
+
+=item *
+
+GNU LilyPond is free. Commercial windows packages for setting music are
+abundant. Free musicprinting software is scarce.
+
+=item *
+
+GNU LilyPond is written in GNU C++. It will not be downgraded/ported to fit
+broken systems.
+
+=back
+
+=head1 MUDELA
+
+The design of Mudela has been (perfect past tense, hopefully) an
+ongoing process, the most important criteria being:
+
+=over 4
+
+=item *
+
+define the (musical) message of the composer as unambiguously as possible,
+
+=item *
+
+be intuitive, and easily readable
+(compared to, say, Musi*TeX input, or MIDI :-),
+
+=item *
+
+be writable in ASCII with a simple texteditor, yfte(TM).
+
+=back
+
+Other considerations were (and will be):
+
+=over 4
+
+=item *
+
+be able to edit the layout without danger of changing the original
+music (Urtext),
+
+=item *
+
+allow for adding different interpretations, again,
+without danger of changing the original,
+
+=item *
+
+easy to create a conductor's score,
+as well as the scores for all individual instruments,
+
+=item *
+
+provide simple musical manipulations, such as
+S<(i) extracting> a slice of music from a previously defined piece,
+S<(ii) extracting> only the rhythm from a piece of music,
+S<(iii) transposing>, etc.,
+
+=item *
+
+easy to comprehend to both programmers and others.
+
+=back
+
+One of the things that (might) be here would be: feasible to use in a
+graphic editor. We don't have experience with these beasts, so we
+don't know how to do this. Comments appreciated.
+
+Musical pieces could be
+
+=over 4
+
+=item *
+
+Mahlerian orchestral scores,
+
+=item *
+
+piano pieces (Schubertian, Rachmaninovian),
+
+=item *
+
+pop songs (lyrics and chords),
+
+=item *
+
+gregorian chants,
+
+=item *
+
+Bach multivoice organ pieces,
+
+=item *
+
+short excerpts to be used in musicological publications.
+
+=back
=head1 NAME
-LilyExamples - LilyPond example input
+LilyExamples - GNU LilyPond example input
=head1 DESCRIPTION
-This file documents the example inputfiles of LilyPond. Information of
+This file documents the example inputfiles of GNU LilyPond. Information of
each file:
title
description (composer, piece)
- tested LilyPond features.
+ tested GNU LilyPond features.
copyright info
-Most music distributed with LilyPond was composed a long time ago, and
+Most music distributed with GNU LilyPond was composed a long time ago, and
do not have copyrights. Any exceptions are mentioned here.
=head2 F<cadenza.ly>
Features: example with lots of newbie comment.
+Copyright: public domain
+
=head2 F<maartje.ly>
Features: partial measure.
=head2 F<scales.ly>
Features: plets, accents, beam steepnesses, dynamics, crescendi,
-\octave command.
+\octave command, \transpose, multiple scripts
=head2 F<scsii-menuetto.ly>
-J. S. Bach, Solo Cello Suites. Suite II part v Menuetto I
+J. S. Bach, Solo Cello Suites. Suite II part v Menuetto I. BWV ?
Features: breaking algorithm, chords, multivoice, accents
=head2 F<twinkle.ly>
+Twinkle twinkle little star in three languages.
+
Features: lyrics
=head2 F<wohltemperirt.ly>
-JS Bach, Das Wohltemperirtes Clavier I, Fuga II (c-minor)
-
-a 7 bar fragment.
+JS Bach, Das Wohltemperirtes Clavier I, Fuga II (c-minor), BWV ?
Features: stem direction, multivoice.
=head1 NAME
-FAQ - LilyPond FAQs
+FAQ - GNU LilyPond FAQs
=head1 DESCRIPTION
Some questions that have been answered before.
-=head2 language
+=head2 Language: mudela
+
+Q: Why can't you type C<#c> in stead of C<cis> ?
+
+A: We think that C<#c> looks as if you are entering the symbols to
+print (which you are not; remember, you're entering the musical
+content in Mudela)
+
+We're not sure on leaving out this feature. If you think this is a
+good idea, please let us know.
+
+Be warned we will I<not> allow you to leave out the C<#> if the note
+already has an accidental. We won't allow
+
+ c# c % no way!
+
+in stead of:
+
+ cis cis
+ #c #c
+
Q: I can type
Q: Why do I need g++ >= 2.7?
-A: By using g++ LilyPond is portable to all platforms which support
+A: By using g++, GNU LilyPond is portable to all platforms which support
g++ (there are quite a few). Not having to support other compilers
-saves us a I<lot> of trouble. LilyPond and FlowerLib use:
+saves us a I<lot> of trouble. GNU LilyPond and FlowerLib use:
=over 4
A.0: Reconsider. Try Linux. It's fun!
-A.1: Currently (patchlevel 27), LilyPond (and flowerLib) compiles, links
+A.1: Currently (patchlevel 27), GNU LilyPond (and flowerLib) compiles, links
and runs on windhoos-nt, using the cygnus gnu port (release b17.1).
I (JCN) only had to make a minor workaround for missing library calls.
-Have a look at http://www.cygnus.com/gnu-win32. To make LilyPond type
+Have a look at http://www.cygnus.com/gnu-win32. To make GNU LilyPond type
C<make $OSTYPE>. (I am not promising to maintain this platform, it is just
that when having to use doze, i-m sometimes too lazy to reboot.)
=head1 NAME
-LilyPond -- the Webpage
+GNU LilyPond -- the Webpage
Excuse me for this poor page. I don't really have time for doing this..
=head1 DESCRIPTION
-Technically LilyPond is a preprocessor which generates TeX
+Technically GNU LilyPond is a preprocessor which generates TeX
(or LaTeX) output which contains information to typeset a musical
score. Practically it is a typesetter, which only uses TeX as an
output medium. (this is handy because there exist music fonts for TeX)
It translates script files (mudela files or F<*.ly>'s) into TeX input.
Typesetting music is a complex task, whereas the message that printed
-music conveys is usually a simple one. LilyPond is a try at providing
+music conveys is usually a simple one. GNU LilyPond is a try at providing
a simple interface for setting music.
=head1 DOCUMENTATION
</a
>
-
-
+=item *
+<a href=MANIFESTO.html
+>
+Design criteria
+</a
+>
=item *
<a href=lilypond.html
=head1 NAME
-LilyGuts - doco to the internals of LilyPond
+LilyGuts - doco to the internals of GNU LilyPond
=head1 DESCRIPTION
-This page documents some aspects of the internals of LilyPond. Some of
+This page documents some aspects of the internals of GNU LilyPond. Some of
this stuff comes from e-mail I wrote, some from e-mail others wrote,
some are large comments taken away from the headers
=head1 OVERVIEW
-LilyPond is a "5-pass" system:
+GNU LilyPond is a "5-pass" system:
=over 4
\discretionary{bar meter}{clef meter}{ bar meter }
-In Lilypond, we have the same concepts (and the same
+In GNU Lilypond, we have the same concepts (and the same
terminology). Each (nonrhythmic) symbol is typeset using a Command
(code: TYPESET). At a breakpoint, TYPESET commands can be grouped
using separators (in lower case):
as you can see, these distance are conflicting. So instead of
satisfying all those ideals simultaneously, a compromise is sought.
-This is Columbus' egg: LilyPond attaches "springs" to each
+This is Columbus' egg: GNU LilyPond attaches "springs" to each
column-pair. each spring has an equilibrium-position which is equal to
the above mentioned distance, so
This algorithm for doing one line, gives a "badness" parameter for
each line (the potential energy). Now one can use TeX's algorithm for
making paragraphs (using this new version of "badness"): one should
-try to minimise the overall badness of a paragraph. LilyPond also uses the
-concept of pre- and post-breaks.
+try to minimise the overall badness of a paragraph. GNU LilyPond also
+uses the concept of pre- and post-breaks.
(actually, it is a bit more complicated: each column also has a
minimum distance to other columns, to prevent symbols from running
=item B<-w,--warranty>,
-Show the warranty with which GNU LilyPond comes. (It comes with B<NO WARRANTY>!)
+Show the warranty with which GNU LilyPond comes. (It comes with B<NO
+WARRANTY>!)
=item B<-o,--output=>F<FILE>,
=head1 FEATURES
+This is an overview of the features that GNU LilyPond supports. For
+details on how to use them, you should consult mudela(5)
+
=over 5
=item *
=back
-=head1 DESIGN CONSIDERATIONS
-
-GNU LilyPond was written with some considerations in mind:
-
-=over 5
-
-=item *
-
-Describing a well-defined language for defining music. We call
-this language (rather arrogantly) The Musical Definition Language
-(mudela for short). GNU LilyPond reads a mudela sourcefile and outputs a
-TeX file.
-
-=item *
-
-We want to provide an easy-to-use interface for typesetting music in
-its broadest sense. This interface should be intuitive from a musical
-point of view. By broadest sense we mean: it is designed for music
-printed left to right in staffs, using notes to designate rythm and
-pitch.
-
-=item *
-
-GNU LilyPond uses MusiXTeX fonts and TeX for its output. This is not a key
-issue: in a future version, GNU LilyPond might bypass TeX, but at the moment
-TeX is very convenient for producing output.
-
-=item *
-
-Generate high-quality output. Ideally it should be of a professional
-quality. We'd like to render Herbert Chlapiks words, "Fine music
-setting is not possible without a knowledgeable printer," untrue.
-
-=item *
-
-GNU LilyPond does not display notes directly, nor will it be rehacked to be
-used interactively. GNU LilyPond writes output to a file. It will not be
-extended to play music, or to recognize music.
-
-=item *
-
-GNU LilyPond is intended to run on Unix platforms, but it should
-be portable to any platform which can run TeX and the GNU tools
-
-=item *
-
-GNU LilyPond is free. Commercial windows packages for setting music are
-abundant. Free musicprinting software is scarce.
-
-=item *
-
-GNU LilyPond is written in GNU C++. It will not be downgraded/ported to fit
-broken systems.
-
-=back
-
=head1
DISCLAIMER & COPYING POLICY
=over 5
=item F<symbol.ini>
+
The initialisation file with symbol tables etc. It
includes files from the directory F<init/>.
=head1 SEE ALSO
-mudela(5)
+=over 4
+
+=item lilygut(?)
+
+On technical details of LilyPond
+
+=item mudela(5)
+
+On the input format
-There are some documentation files in the subdirectory F<Documentation/>,
-among others: lilygut, error, faq,
+=item MANIFESTO
+
+Goals of the GNU LilyPond project.
+
+=item The GNU LilyPond FAQ list
+
+=back
-http://www.stack.nl/~hanwen/lilypond/index.html
+GNU LilyPond has her own webpage at
+http://www.stack.nl/~hanwen/lilypond/index.html. This webpage contains
+the MIDI, GIF and PS files for some standard music files. It also has
+the complete LilyPond documentation
=head1 REMARKS
=head1 NAME
-Mudela - LilyPond input format 0.1
+Mudela - GNU LilyPond input format 0.1
=head1 DESCRIPTION
-This document describes the the LilyPond input format, which is an
+This document describes the the GNU LilyPond input format, which is an
effective language for definining music. We call this language
(rather arrogantly) The Musical Definition Language (S<Mudela 0.1>).
being complete from both from a musical typesetting,
as from a musical performing point of view.
-The design of Mudela has been (perfect past tense, hopefully)
-an ongoing process,
-the most important criteria being:
-
-=over 4
-
-=item *
-
-define the (musical) message of the composer as unambiguously as possible,
-
-=item *
-
-be intuitive, and easily readable
-(compared to, say, Musi*TeX input, or MIDI :-),
-
-=item *
-
-be writable in ASCII with a simple texteditor, yfte(TM).
-
-=back
-
-Other considerations were (and will be):
-
-=over 4
-
-=item *
-
-be able to edit the layout without danger of changing the original
-music (Urtext),
-
-=item *
-
-allow for adding different interpretations, again,
-without danger of changing the original,
-
-=item *
-
-easy to create a conductor's score,
-as well as the scores for all individual instruments,
-
-=item *
-
-provide simple musical manipulations, such as
-S<(i) extracting> a slice of music from a previously defined piece,
-S<(ii) extracting> only the rhythm from a piece of music,
-S<(iii) transposing>, etc.,
-
-=item *
-
-easy to comprehend to both programmers and others.
-
-=back
-
-Musical pieces could be
-
-=over 5
-
-=item *
-
-Mahlerian orchestral scores,
-
-=item *
-
-piano pieces (Schubertian, Rachmaninovian),
-
-=item *
-
-pop songs (lyrics and chords),
-
-=item *
-
-gregorian chants,
-
-=item *
-
-Bach multivoice organ pieces,
-
-=item *
-
-short excerpts to be used in musicological publications.
-
-=back
-
=head1 Overview
Line comments are introduced by a C<%>
+=head2 Versions
+
+Occasionally, small changes in syntax across different versions of
+Mudela might give syntax errors. To warn you about possible
+incompatibilities, you can specify the Mudela version for which the
+inputfile was written,
+
+ \version "0.0.50";
+
=head2 Words
Keywords are preceded by a backslash "\". They contain alphabetic
Notenames are just a special kind of identifiers, and can be declared
for any language appropriate (see F<dutch.ini>). The default language
-for notenames is defined to be dutch,
+for notenames is defined to be dutch. In dutch, the notenames are
+a,b,c,d,e,f and g. Sharps are formed by adding the extension "is",
+flats by adding "es"
% double sharp
cisis disis eisis fisis gisis aisis bisis
-
=head2 Defaults
If omit the duration of a, a default value is substituted. For this
=head2 Music direction
-Mudela reads left to right, but LilyPond can stack voices and
+Mudela reads left to right, but you can still stack voices and
Voice_elements which are produced in two directions: horizontal
(voice like) and vertical (chord like)
its elements. The C<\multivoice> is a construct which is explained
below.
+=head2 Transposition
+
+You can transpose horizontal music in the following way:
+
+ \transpose { d % from c to d that's one octave up.
+ { e4 f4 } % the horizontal music
+ }
+
=head2 Rhythms
Rhythms in Mudela are entered identical to Simple mudela.
=head2 Examples
-Examples are included with the LilyPond distribution. For the sake of
+Examples are included with the GNU LilyPond distribution. For the sake of
maintenance no long examples are included in this document.
done by members of the same voicegroups (beams, brackets, stems)
-=head2 Other
-
-LilyPond first reads F<symbol.ini>, which contains declarations crucial
-to proper operation of LilyPond (symbol tables, note names).
=head1 HISTORY
-This language has a number of roots. First and foremost, LilyPond's
+This language has a number of roots. First and foremost, GNU LilyPond's
predecessor mpp was the inspiration of simple Mudela. Secondly, the
hierarchical structure looks a lot like Rayce's (Rayce is a raytracer
that I've written as a hobby project. ), which in turn owes a lot to
N\bN\bN\bNA\bA\bA\bAM\bM\bM\bME\bE\bE\bE
- INSTALL - installing LilyPond
+ INSTALL - installing GNU LilyPond
D\bD\bD\bDE\bE\bE\bES\bS\bS\bSC\bC\bC\bCR\bR\bR\bRI\bI\bI\bIP\bP\bP\bPT\bT\bT\bTI\bI\bI\bIO\bO\bO\bON\bN\bN\bN
- This page documents installation and compilation of
+ This page documents installation and compilation of GNU
LilyPond
I\bI\bI\bIM\bM\bM\bMP\bP\bP\bPO\bO\bO\bOR\bR\bR\bRT\bT\bT\bTA\bA\bA\bAN\bN\bN\bNT\bT\bT\bT
P\bP\bP\bPR\bR\bR\bRE\bE\bE\bER\bR\bR\bRE\bE\bE\bEQ\bQ\bQ\bQU\bU\bU\bUI\bI\bI\bIS\bS\bS\bSI\bI\bI\bIT\bT\bT\bTE\bE\bE\bES\bS\bS\bS
For compilation you need.
- +\bo Unix. LilyPond is known to run on Linux, AIX, Digital
- Unix and Solaris
+ +\bo Unix. GNU LilyPond is known to run on Linux, AIX,
+ Digital Unix and Solaris
If you have the Cygnus WIN32 port of the GNU utils,
it will even work in Lose NT/95, but don't promise to
support it.
+\bo (GNU) find
C\bC\bC\bCO\bO\bO\bON\bN\bN\bNF\bF\bF\bFI\bI\bI\bIG\bG\bG\bGU\bU\bU\bUR\bR\bR\bRI\bI\bI\bIN\bN\bN\bNG\bG\bG\bG a\ba\ba\ban\bn\bn\bnd\bd\bd\bd C\bC\bC\bCO\bO\bO\bOM\bM\bM\bMP\bP\bP\bPI\bI\bI\bIL\bL\bL\bLI\bI\bI\bIN\bN\bN\bNG\bG\bG\bG
- to install LilyPond, simply type:
+ to install GNU LilyPond, simply type:
configure
make install
-3/Apr/97 LilyPond 0.0.50 1
+14/Apr/97 LilyPond 0.0.51 1
configure --prefix=/home/me_myself_and_I/
- Since LilyPond currently is beta, You are advised to also
- use
+ Since GNU LilyPond currently is beta, You are advised to
+ also use
--enable-debug
--enable-checking
subdirectory _\bb_\bi_\bn_\b/.
R\bR\bR\bRU\bU\bU\bUN\bN\bN\bNN\bN\bN\bNI\bI\bI\bIN\bN\bN\bNG\bG\bG\bG
- LilyPond does use a lot of resources. For operation you
- need the following:
+ GNU LilyPond does use a lot of resources. For operation
+ you need the following:
+\bo A fast computer (a full page of music typically takes 1
minute on my 486/66, using the -\b-\b-\b--\b-\b-\b-e\be\be\ben\bn\bn\bna\ba\ba\bab\bb\bb\bbl\bl\bl\ble\be\be\be-\b-\b-\b-c\bc\bc\bch\bh\bh\bhe\be\be\bec\bc\bc\bck\bk\bk\bki\bi\bi\bin\bn\bn\bng\bg\bg\bg
-3/Apr/97 LilyPond 0.0.50 2
+14/Apr/97 LilyPond 0.0.51 2
you need the cygnus win32 gnu port development stuff; have
a look at http://www.cygnus.com/gnu-win32.
- to make LilyPond under, brr, aargh, well, simply type:
+ to make GNU LilyPond under, brr, aargh, well, simply type:
bash configure
make win32
P\bP\bP\bPL\bL\bL\bLA\bA\bA\bAT\bT\bT\bTF\bF\bF\bFO\bO\bO\bOR\bR\bR\bRM\bM\bM\bMS\bS\bS\bS
- LilyPond (pl 0.0.39) is known to compile on the following
- platforms:
+ GNU LilyPond (pl 0.0.39) is known to compile on the
+ following platforms:
* linux 2.0.28, g++ 2.7.2[.1]
* aix 4.1, g++ 2.7.2
-3/Apr/97 LilyPond 0.0.50 3
+14/Apr/97 LilyPond 0.0.51 3
+pl 51
+ - transposition bugfix + doco
+ - LilyPond -> GNU LilyPond
+ - bugfixes for Staff_side and Note_column*
+ - wohltemperirt: 12 more bars
+
+******
+april 11
pl 50
- merge rest / notehead.
- Staff_side as a base class for most "staff-side" symbols.
- version check
- Note_column_register, Note_column
- multiple scripts
+
********
april 8
pl 49.jcn1
-
-warning: the --enable-optimise compile seems to broken!!
-
-===================
IMPORTANT:
if you have downloaded a
--- /dev/null
+Testing for 0.1 in 3 stages:
+
+ 1. Announce "beta testers wanted"
+ to linux.dev.apps, gnu.announce, mutex
+
+ Source only dist
+
+ GOAL: bugfixes & doco updates
+
+ create mailing list
+
+ 2. Announce to LilyPond list, GNU "internal" list, RoseGarden
+list ?, LDA, Mutex
+
+ Source & binary dist too, beta release to fsf?
+
+ GOAL: distribution & portability testing
+
+ 3. Announce to COLA, gnu.announce
+
+ Public release
* decent TeX page layout
* per-pstaff item-widths
-
- * remove unnecessary or confusing constructs from .ly
- * key undo
+ * script priority
This is an assorted collection of stuff that will be done, might be
done, or is an idea that I want to think about
PARSER
* Duration-> Musical_duration, typedef Rational Duration?
-MAKE-STUFF
-
- * do platform stuff: configure, header(s), targets, build (out?)
-
BUGS
+ * hairpin width
+
+ * problems with empty staff.
+
* help-lines
* help-lines for rests
* lilypond - -> crash
+ * \stem -1 < chord > rest
+
SEVERELY LACKING:
+ * SPEED!
+
* grace notes
FURTHER FOR ORCHESTRAL SCORE:
* half-sharps, half-flats
+ * key undo
+
* unix style paths for LILYINCLUDE EN
* rpm package buildroot
* C meter iso 4/4
* textspanner: center position
-
* script-spacing
* Brackets
* add (good guess of) width to lyric items
- * midi output: eat-up dynamic, key/meter/tempo changes, and write them neatly
+ * midi output: eat-up dynamic, key/meter/tempo changes, and
+write them neatly
* LilyPond .deb
* Junk Staff_column, and find the requests while walking the Voices.?
+ * MIDI repeat: make lily understand repeats
+
+
* better beamslope calculation: QLP for beams?
* implement better breaking algorithm
* piano staff
+ * vertical spanner
IDEAS
* integrate Register/Midi stuff
* #c <-> cis
* breath marks
+
+ * used fixedpoint arithmetic for min. energy.
gis = \melodic_request { -1 4 1 }
gisis = \melodic_request { -1 4 2 }
ases = \melodic_request { -1 5 -2 }
+ aes = \melodic_request { -1 5 -1 }
as = \melodic_request { -1 5 -1 }
a = \melodic_request { -1 5 0 }
ais = \melodic_request { -1 5 1 }
G = \melodic_request { -2 4 0 }
Gis = \melodic_request { -2 4 1 }
Gisis = \melodic_request { -2 4 2 }
+ Aeses = \melodic_request { -2 5 -2 }
Ases = \melodic_request { -2 5 -2 }
+ Aes = \melodic_request { -2 5 -1 }
As = \melodic_request { -2 5 -1 }
A = \melodic_request { -2 5 0 }
Ais = \melodic_request { -2 5 1 }
+\version "0.0.50";
+
include "register.ini"
include "dynamic.ini"
include "dutch.ini" % do not include init/ path
g g| f f| e e| d d| g g| f f| e e| d d|
%%% var 1
c r8 c8 % r8 means an 8th rest.
- (| % \start a slur
- % NOTE: the slur\start should be directly after the note
+ (| % start a slur
+ % NOTE: the slurstart should be directly after the note
) % end a slur.
g r8 g8 (| ) a r8 a8 (| ) g r4
f r8 f8 (| ) e4 r8 e8 ( |) d4 r8 d8 (| ) c4 r4
c d
\clef "violin" ;
\octave c' ;
- c d
+ < \transpose { d { e f } } >
\octave c'' ;
c d
\duration 8 ;
\octave c' ;
|[ a a a a a a a a \! a ]6/9
\octave c'' ;
- [ 'c 'g d a e' b' f'' c''' g''' ]6/9
- [ g''' c''' f'' b' e' a d 'g 'c ]6/9
+ ['c->-.-\fermata \< 'g->-.-\fermata d->-.-\fermata a->-.-\fermata
+ e'->-.-\fermata b'-. f''-. c'''->-.-\fermata \! g'''->-.-\fermata \> ]6/9
+ [g'''->-.-\fermata c'''->-.-\fermata f''->-.-\fermata b'->-.-\fermata e'->-.-\fermata a->-.-\fermata d->-.-\fermata 'g->-.-\fermata \! 'c->-.-\fermata ]6/9
+ \octave c;
+ ['c->-.-\fermata \< 'g->-.-\fermata d->-.-\fermata a->-.-\fermata
+ e'->-.-\fermata b'-. f''-. c'''->-.-\fermata \! g'''->-.-\fermata \> ]6/9
+ [g'''->-.-\fermata c'''->-.-\fermata f''->-.-\fermata b'->-.-\fermata e'->-.-\fermata a->-.-\fermata d->-.-\fermata 'g->-.-\fermata \! 'c->-.-\fermata ]6/9
\octave c' ;
- [ 'c 'g d a e' b' f'' c''' g''' ]6/9
- [ g''' c''' f'' b' e' a d 'g 'c ]6/9
\octave c' ;
[ c g d' ]2/3
[ d' g c ]2/3
% JS Bach, Das Wohltemperirtes Clavier I, Fuga II (c-minor)
%
-% a 7 \bar fragment
-%
% Public Domain -- typed by by HWN
%
\version "0.0.50";
- global = \melodic{
+global = \melodic{
\meter 4/4 ;
\grouping 2*2;
\key bes es as;
- }
+}
- dux = \melodic {
+dux = \melodic {
\clef "violin";
\octave c' ;
\duration \last ;
[g a bes8(] [)bes16 es f g ] [as g f es] [d8 c'16 b]|
c'4 r4 r8 [f' es' d']
r8 [as g f] [g f16 es] [f8 d] |
+ g4 r8 b [c' c'16 b] [c'8 g] |
+%% 10
+ as4 r8 a [bes bes16 a] [bes8 f] |
+ g4 r8 g [as as g f] | % should jump staff
+ \octave c;
+ r8 [as bes c'] r8 [as16 g] [as8 f8] |
+ [bes8 c bes as ] [bes g f es] |
+ [f des' c' bes ] [c' as g f] |
+ [g8 %jump!
+ \octave c';
+ g16 fis] [g8 c] [es g16 fis] [g8 a] |
+ [d g16 fis] [g8 a] [c16 d] es4 [d16 c] |
+ 'bes8 r8 r16 [d e fis ] [g a bes8( ] [)bes16 e f g] |
+ [a bes c'8(] [)c'16 fis16 g a ] [bes8 es16 d] [es8 'g] |
+ ['as f16 e] [f8 'a8] ['bes g16 f] [g8 'b] |
+% 20
+ [c16 f es d] [c Bes As G] [F8 as g f] |
+ [es d es f] [B c d B] |
+ c4 r8 e8 [f f16 e] [f8 c] |
+ d4 r8 d8 [es8 es16 d] [es8 Bes] |
+ c2 () [c8 d16 es][ f es f d] |
+ B8 r8 r B c r r es |
+ d r r f()f r r f |
+ [es as g f] [es d es f] |
+ [B c d B] [B c] r c |
+ [f16 d es c]()[c8 B] c4 r8 e |
+ f4 r8 <f8 as b> [f es16 d] [es8 <f a] > |
+ <B d> r <B d> r <G2 c> |
}
comes = \melodic {
['bes8 g16 f] [g8 'b] [c8 d16 es] f4( |
[) f8 es16 d] [c16 'bes 'as 'g] ['f8 as g f]
[es d es f] ['b c d 'b] |
+ [c g16 fis] [g8 d] es4 r8 e8 |
+%% 10
+ [f f16 e] [f8 c8] d4 r8 d |
+ [es8 es16 d] [es8 'bes] [c es16 d] [es8 f] |
+ ['bes es16 d] [es8 f] ['as16 'bes] c4 ['bes16 'as] |
+ [G16 Es F G] [As Bes c d] [es d c d] [es f g a] |
+ [bes F G As] [Bes c d e] [f es d es] [ f g a b] |
+ [c'8 b16 a] [g f e d] [c8 es d c] |
+ [Bes A Bes c] [Fis G A Fis] |
+ [G8 d16 c] d8 r8 r8 [e16 d] e8 r8 |
+ r [fis16 e] fis8 r r [G16 F] G8 r8 |
+ r8 [A16 G] A8 r r [B16 A] B8 r |
+%% 20
+ r8 [c16 'b] [c8 'g] [As c16 'c] [c8 d] |
+ [G c16 B] [c8 d] [F16 G] As4 [G16 F] |
+ [Es8 c16 B] [c8 G] As4 r8 A |
+ [Bes8 Bes16 A] [Bes8 F8] g4 r8 G(|
+ )[G As16 Bes] [c B c As] F2( |
+ )[F8 d16 c] [d8 F] [Es es16 d] [es8 G] |
+ [F f16 es] [f8 As] [G16 f es d] [c B A G] |
+ [c8 f es d] r [As G f] |
+ [G F16 Es] [F8 D] [As G] r A |
+ [B c] [F16 Es D C] [C8 c16 B] [c8 G]|
+ [As c16 B] [c8 d] [G8 c16 B] [c8 d] |
+ [F16 G] As4 [G16 F] E2 |
}
r1 |
r8 [c16 B] [c8 G] [As c16 B] [c8 d] |
[G c16 B] [c8 d] [F16 G] As4 [G16 F] |
+ \octave c;
+ [es c' b a] [g f es d] [c d es d] [c Bes As G] |
+%% 10
+ [F bes as g ] [f es d c] [Bes c d c ] [Bes As G F]|
+ [Es as g f] [es des c Bes] [As8 c' bes as] |
+ [g8 f g as] [d es f d] |
+ [es as g f] [g es d c] |
+ [d bes as g] [as f es d] |
+ es8 r8 r4 r8 [c Bes A] |
+ r [es d c] [d c16 Bes] [c8 d] |
+ [G8 bes16 a] [bes8 d] [es c'16 bes] [c'8 e] |
+ [f d'16 c'] [d'8 fis] g4 r16 [G A B] |
+ [c16 d es8]()[es16 A Bes c] [d es f8]()[f16 'b c d]|
+%%20
+ es8 r r e [f F Es D] |
+ r [As G F] [G F16 Es] [F8 G] |
+ [c16 d es d] [c Bes As G] [F bes as g] [f es d c] |
+ [Bes c d c] [Bes As G F] [Es As g f ] [es d c Bes] |
+ [As Bes c Bes] [As G F Es] [D g f es ] [d c B A] |
+ g4 r4 r16 [G A B] [c d es f] |
+ [g f as g] [f es d c] [B8 c16 B] [c8 G] |
+ [As c16 B] [c8 d] [G c16 B] [c8 d] |
+ [F16 G] As4 [G16 F] Es4 r8 es |
+ [d c g G]
+ < \multivoice
+ { \stem 1; c2 (|)c1(|) c1 }
+ { \stem -1; C2(|)C1(|) C1 }
+ >
+
}
% every "melody" declared in a staff has its own "voicegroup"
}
\paper{}
\midi{
- \tempo 4:90
+ \tempo 4:84
}
}
MAJOR_VERSION = 0
MINOR_VERSION = 0
-PATCH_LEVEL = 49
+PATCH_LEVEL = 51
# use to send patches, always empty for released version:
# include separator: ".postfix", "-pl" makes rpm barf
}
Symbol s( paper()->lookup_l()->hairpin(w_dim, grow_dir_i_ < 0) );
m_p->add(Atom(s));
- int pos = get_position_i();
+ int pos = get_position_i(s.dim.y);
m_p->translate(Offset(x_off_dim,pos * paper()->internote()));
}
#include "paper-def.hh"
#include "score-column.hh"
#include "staff-sym.hh"
+#include "note-column.hh"
Dynamic_register::Dynamic_register()
{
}
delete cresc_p_;
}
+void
+Dynamic_register::acknowledge_element(Staff_elem_info i)
+{
+ if (i.elem_l_->name() == Note_column::static_name()) {
+ if (dynamic_p_) dynamic_p_->add_support(i.elem_l_);
+ if (to_end_cresc_p_)
+ to_end_cresc_p_->add_support(i.elem_l_);
+ if (cresc_p_)
+ cresc_p_->add_support(i.elem_l_);
+ }
+}
--- /dev/null
+/*
+ headreg.cc -- part of LilyPond
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+#include "notehead.hh"
+#include "head-reg.hh"
+#include "paper-def.hh"
+#include "complex-walker.hh"
+#include "musical-request.hh"
+
+Notehead_register::Notehead_register()
+{
+ note_p_ = 0;
+ set_feature(Features::dir(0));
+ post_move_processing();
+}
+
+bool
+Notehead_register::try_request(Request *req_l)
+{
+ if (req_l->note() || req_l->rest())
+ note_req_l_=req_l->rhythmic();
+ else
+ return false;
+
+ return true;
+}
+void
+Notehead_register::set_feature(Features d)
+{
+ if(d.direction_i_ || d.initialiser_b_)
+ dir_i_ = d.direction_i_;
+}
+
+void
+Notehead_register::process_requests()
+{
+ if (!note_req_l_)
+ return;
+
+ Notehead*n_p = new Notehead(8); // ugh
+ note_p_ = n_p;
+ n_p->set_rhythmic(note_req_l_->rhythmic());
+
+ if (note_req_l_->note()) {
+ n_p->position = note_req_l_->note()->height() +
+ *get_staff_info().c0_position_i_l_;
+ } else if (note_req_l_->rest()) {
+ n_p->rest_b_ = true;
+ if (note_req_l_->rhythmic()->duration_.type_i_ <= 2)
+ note_p_->translate(
+ Offset(0,
+ 6 * paper()->internote()));
+ }
+
+ Staff_elem_info itinf(note_p_,note_req_l_);
+ announce_element(itinf);
+}
+
+void
+Notehead_register::pre_move_processing()
+{
+ if (note_p_) {
+ if (dir_i_ && note_p_->rest_b_ ) {
+ note_p_->position +=4*dir_i_ ;
+ }
+ typeset_element(note_p_);
+ note_p_ = 0;
+ }
+}
+void
+Notehead_register::post_move_processing()
+{
+ note_req_l_ = 0;
+}
+
+IMPLEMENT_STATIC_NAME(Notehead_register);
+ADD_THIS_REGISTER(Notehead_register);
+++ /dev/null
-/*
- headreg.cc -- part of LilyPond
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-#include "notehead.hh"
-#include "head-reg.hh"
-#include "paper-def.hh"
-#include "complex-walker.hh"
-#include "musical-request.hh"
-
-Notehead_register::Notehead_register()
-{
- note_p_ = 0;
- set_feature(Features::dir(0));
- post_move_processing();
-}
-
-bool
-Notehead_register::try_request(Request *req_l)
-{
- if (req_l->note() || req_l->rest())
- note_req_l_=req_l->rhythmic();
- else
- return false;
-
- return true;
-}
-void
-Notehead_register::set_feature(Features d)
-{
- if(d.direction_i_ || d.initialiser_b_)
- dir_i_ = d.direction_i_;
-}
-
-void
-Notehead_register::process_requests()
-{
- if (!note_req_l_)
- return;
-
- Notehead*n_p = new Notehead(8); // ugh
- note_p_ = n_p;
- n_p->set_rhythmic(note_req_l_->rhythmic());
-
- if (note_req_l_->note()) {
- n_p->position = note_req_l_->note()->height() +
- *get_staff_info().c0_position_i_l_;
- } else if (note_req_l_->rest()) {
- n_p->rest_b_ = true;
- if (note_req_l_->rhythmic()->duration_.type_i_ <= 2)
- note_p_->translate(
- Offset(0,
- 6 * paper()->internote()));
- }
-
- Staff_elem_info itinf(note_p_,note_req_l_);
- announce_element(itinf);
-}
-
-void
-Notehead_register::pre_move_processing()
-{
- if (note_p_) {
- if (dir_i_ && note_p_->rest_b_ && note_p_->balltype <= 2) {
- note_p_->position +=4*dir_i_ ;
- }
- typeset_element(note_p_);
- note_p_ = 0;
- }
-}
-void
-Notehead_register::post_move_processing()
-{
- note_req_l_ = 0;
-}
-
-IMPLEMENT_STATIC_NAME(Notehead_register);
-ADD_THIS_REGISTER(Notehead_register);
~Dynamic_register();
NAME_MEMBERS(Dynamic_register);
protected:
+ virtual void acknowledge_element(Staff_elem_info);
virtual bool try_request(Request *req_l);
virtual void process_requests();
virtual void pre_move_processing();
protected:
int get_position_i()const;
+ int get_position_i(Interval)const;
};
#endif // STAFF_SIDE_HH
/* ***************/
- NAME_MEMBERS(Text_item);
- virtual void set_default_index();
- Molecule* brew_molecule_p() const;
- void do_pre_processing();
Text_item(Text_def*);
Text_item(Text_req*);
~Text_item();
+ NAME_MEMBERS(Text_item);
+protected:
+ virtual void set_default_index();
+ Molecule* brew_molecule_p() const;
+ virtual void do_post_processing();
};
#define TEXTREG_HH
#include "register.hh"
-struct Text_register : Request_register{
+class Text_register : public Request_register{
Text_item * text_p_;
Text_req * text_req_l_;
int dir_i_;
/* *************** */
+protected:
virtual void set_feature(Features );
- Text_register();
virtual bool try_request(Request*);
virtual void process_requests();
virtual void pre_move_processing();
virtual void post_move_processing();
+ virtual void acknowledge_element(Staff_elem_info);
+public:
+ Text_register();
NAME_MEMBERS(Text_register);
};
WORD {A}{AN}*
ALPHAWORD {A}+
INT -?{N}+
-REAL {INT}?(\.{N}*)?
+REAL {INT}?(\.{N}+)?
KEYWORD \\{WORD}
WHITE [ \n\t\f]
BLACK [^ \n\t\f]
void
Melodic_req::transpose(Melodic_req const & delta)
{
+ int old_pitch = pitch();
+ int delta_pitch = delta.pitch();
octave_i_ += delta.octave_i_;
notename_i_ += delta.notename_i_;
while (notename_i_ >= 7 ) {
notename_i_ -= 7;
octave_i_ ++;
}
- accidental_i_ += delta.accidental_i_;
+ int new_pitch = pitch();
+ int delta_acc = new_pitch - old_pitch - delta_pitch;
+
+ accidental_i_ -= delta_acc;
if (abs(accidental_i_) > 2) {
delta.warning("transposition makes accidental larger than 2");
}
if (!acceptable_elem_b(i.elem_l_))
return;
- if (!ncol_p_)
+ if (!ncol_p_){
ncol_p_ = new Note_column;
-
+ announce_element(Staff_elem_info(ncol_p_, 0));
+ }
char const*nC = i.elem_l_->name();
if (nC == Script::static_name())
Item *support_l=top_head_l;
int j;
for (j = 0; j < 2; j++ ) {
- for (int i=0; i < placed_l_arr_a[j].size(); j++) {
+ for (int i=0; i < placed_l_arr_a[j].size(); i++) {
placed_l_arr_a[j][i]->add_support(support_l);
support_l = placed_l_arr_a[j][i];
}
}
out->translate(Offset(x_dir * p->note_width(),0));
bool streepjes = (position<-1)||(position > staff_size+1);
+
+ if (rest_b_ && balltype > 2)
+ streepjes = false;
+
if (streepjes) {
int dir = sign(position);
int s =(position<-1) ? -((-position)/2): (position-staff_size)/2;
Register_group_register::acknowledge_element(Staff_elem_info info)
{
Request_register* origin = info.origin_reg_l_arr_[0];
- if (!contains_b(origin) && !origin->contains_b(this))
+ if (!contains_b(origin) && !origin->contains_b(this)) // am i sure?
return;
for (iter_top(reg_list_, i); i.ok(); i++)
#include "staff-side.hh"
#include "staff-sym.hh"
+#include "debug.hh"
void
Staff_side::set_staffsym(Staff_symbol* s_l)
{
if (!staff_sym_l_)
return 0;
+ if (!dir_i_) {
+ warning("Staff_side::get_position_i(): returning -20");
+ return -20;
+ }
Real inter_f = staff_sym_l_->inter_note_f();
int staff_size_i = staff_sym_l_->steps_i();
Interval v= support_height();
y = v[dir_i_] + 2*dir_i_*inter_f; // ugh
}
- return int(rint(Real(y)/inter_f));
+ return int(rint(Real(y)/inter_f)); // should ret a float?
+}
+
+int
+Staff_side::get_position_i(Interval sym_dim) const
+{
+ if (!staff_sym_l_)
+ return 0;
+ if (!dir_i_) {
+ warning("Staff_side::get_position_i(): returning -20");
+ return -20;
+ }
+
+ Real inter_f = staff_sym_l_->inter_note_f();
+
+ int i= get_position_i();
+ return i+ int(rint(- sym_dim[dir_i_] / inter_f));
}
void
Text_item::set_default_index()
{
- pos_i_ = get_position_i();
+ pos_i_ = get_position_i(tdef_p_->create_atom(paper()).extent().y );
}
void
-Text_item::do_pre_processing()
+Text_item::do_post_processing()
{
+ if (!dir_i_)
+ dir_i_ = -1;
set_default_index();
}
(c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
*/
-
+#include "note-column.hh"
#include "musical-request.hh"
#include "text-reg.hh"
#include "text-item.hh"
text_req_l_ = req_l->text();
return true;
}
-
+void
+Text_register::acknowledge_element(Staff_elem_info i)
+{
+ if (text_p_ && i.elem_l_->name() == Note_column::static_name()) {
+ text_p_->add_support(i.elem_l_);
+ }
+}
void
Text_register::process_requests()
{