* ly2dvi: changed headsep to 0pt, as old ly2dvi had. Fixes mutopia
textheight setting.
-1.3.151.jcn1
-============
-
* Fixed feta-braces: more symbols again, but all paper sizes use same
font. Also fixed lookup.
* Website compilation fix.
-1.3.150.jcn3
+1.3.151.mb1
+===========
+
+* ly2dvi: add lilypond directories at end of tex paths
+
+* renewed smart-transpose example
+
+1.3.151.hwn1
============
+* Tutorial revision: add much simpler examples in front.
+
+* abc2ly fix for duration at end of line (Laura Conrad)
+
+* centralCPosition is set by \clef as well; this fixes the grace note +
+clef problem. Property clefPitches is deprecated.
+
+* Separating_group_spanner now searches items until it finds a
+non-empty one. This fixes a problem with lyrics clashes on barlines
+when stanza numbers are on.
+
+* Uniformised progress messages. File names are always printed in quotes.
+
+1.3.151
+=======
+
* ly2dvi: reverted footer change that broke mutopia endfooter.
* Standchen revision (found four new bugs).
* Windows: possibly ly2dvi fix, tex install, minor doco fixes, fixed
some urls.
+* centralCPosition is set by \clef as well; this fixes the grace note +
+clef problem. Property clefPitches is deprecated.
+
+* Separating_group_spanner now searches items until it finds a
+non-empty one. This fixes a problem with lyrics clashes on barlines
+when stanza numbers are on.
+
+* Uniformised progress messages. File names are always printed in quotes.
1.3.150.hwn1
============
* Bugfix: fixed point-and-click broken in jcn2.
-* convert-ly: Added and fixed various entries (our strings with optional "" re\ally suck).
+* convert-ly: Added and fixed various entries
* Small ez play tweaks. Guess I'm a sucker too.
============
* Tied notes at a linebreak repeat their accidental.
-F
+
* Removed some cruft from lily/include/.
* Bugfix: tied notes in chords sometimes got stuck in MIDI output
Scheme. See input/test/molecule-hacking.ly ; allows for a kludged
"parenthesize notehead" command.
-
1.3.123.mb1
===========
* Bugfix: font style Large works regardless of font-shape.
-
-
1.3.123
=======
* Bugfix: changed beam thickness to .48 staff-space.
-
1.3.120.uu1
===========
Those deserving special mentioning (in no particular order): Esther,
Marijke, Heike, Inge, Judith, Hannah, Auke, Ilse, Evelyn, Maartje, Suzanne,
-Ilse (gee, again?), Marieke, Irene, Martine, Idwine and last (but
+Ilse (gee, again?), Marieke, Irene, Martine, and last (but
certainly not least) Janneke!
HWN
</td></tr>
<tr><td><font size=-1>
<a href="@TOP@Documentation/out-www/index.html#everyone">General information</a><br>
- <a href="@TOP@Documentation/out-www/index.html#new-users">New users</a><br>
- <a href="@TOP@Documentation/out-www/index.html#other-users">Other users</a><br>
- <a href="@TOP@Documentation/out-www/index.html#developers">Developers</a><br>
- <a href="@TOP@Documentation/out-www/index.html#background">Background info</a><br>
+ <a href="@TOP@Documentation/out-www/index.html#new-users">For new users</a><br>
+ <a href="@TOP@Documentation/out-www/index.html#other-users">For users</a><br>
+ <a href="@TOP@Documentation/out-www/index.html#developers">For developers</a><br>
+ <a href="@TOP@Documentation/out-www/index.html#background">Background information</a><br>
</td></tr>
<tr><td bgcolor="#e8e8ff">
<b>Download </b>
<a name="other-users">
@end html
-@unnumberedsubsec Information for other users
+@unnumberedsubsec Information for users
@itemize @bullet
@c download sites?
-@c NEWS
-
@c archives?
@item @uref{../user/out-www/lilypond-internals/lilypond-internals.html,lilypond-internals}
-Documentation of internals, generated from the sources.
-
+Documentation of internals, generated from the sources. If you want to
+fine-tune output, you need the information in this document.
@item @uref{../user/out-www/lilypond/lilypond.html,lilypond}
The user manual, (in @uref{../user/out-www/lilypond.ps.gz,PostScript})
@item @uref{../user/out-www/glossary.html,glossary} A glossary of musical
@itemize @bullet
@item @uref{../topdocs/out-www/AUTHORS.html, Authors} documents who did
what on LilyPond.
-
-@item @uref{../misc/out-www/CHANGES-0.0.html, Change logs from 0.0 till 0.1 }
-@item @uref{../misc/out-www/CHANGES-0.1.html, Change logs from 0.1 till 1.0 }
-@item @uref{../misc/out-www/CHANGES-1.0.html, Change logs from 1.0 till 1.1 }
-@item @uref{../misc/out-www/CHANGES-1.1.html, Change logs from 1.1 till
-1.2 }
-@item @uref{../misc/out-www/CHANGES-1.2.html, Change logs from 1.2 till 1.3 }
-@item @uref{../misc/out-www/NEWS-1.2.html, summary of changes from 1.1 till 1.2 }
-@item @uref{../misc/out-www/ANNOUNCE-0.1.html, Announcement of 0.1 (includes summary of
-changes)}
-@item @uref{../misc/out-www/ANNOUNCE-1.0.html, Announcement of 1.0 (includes summary of
-changes)}
-@item @uref{../misc/out-www/ANNOUNCE-1.2.html, Announcement of 1.2 (includes summary of changes)}
-@item @uref{../misc/out-www/AIMS.html, Why LilyPond?}
-@item @uref{../misc/out-www/interview.html, Answers} to the Brave GNU world standard questions.
-@item @uref{../windows/out-www/lily-wins.html, Lily Wins}
+@item @uref{../out-www/NEWS.txt,NEWS} summary of changes for 1.4
+@item @uref{../misc/out-www/CHANGES-0.0.html, CHANGES-0.0} Change logs from 0.0 till 0.1
+@item @uref{../misc/out-www/CHANGES-0.1.html, CHANGES-0.1} Change logs from 0.1 till 1.0
+@item @uref{../misc/out-www/CHANGES-1.0.html, CHANGES-1.0} Change logs from 1.0 till 1.1
+@item @uref{../misc/out-www/CHANGES-1.1.html, CHANGES-1.1} Change logs from 1.1 till
+1.2
+@item @uref{../misc/out-www/CHANGES-1.2.html, CHANGES-1.2} Change logs from 1.2 till 1.3
+@item @uref{../misc/out-www/NEWS-1.2.html, NEWS-1.2} summary of changes from 1.1 till 1.2
+@item @uref{../misc/out-www/ANNOUNCE-0.1.html, ANNOUNCE-0.1} Announcement of 0.1 (includes summary of
+changes)
+@item @uref{../misc/out-www/ANNOUNCE-1.0.html, ANNOUNCE-1.0} Announcement of 1.0 (includes summary of
+changes)
+@item @uref{../misc/out-www/ANNOUNCE-1.2.html, ANNOUNCE-1.2} Announcement of 1.2 (includes summary of changes)
+@item @uref{../misc/out-www/AIMS.html, AIMS} Why LilyPond?
+@item @uref{../misc/out-www/interview.html, interview} Answers to the Brave GNU world standard questions.
+@item @uref{../windows/out-www/lily-wins.html, lily-wins} musings on the
+Windows installer
@end itemize
@unnumberedsubsec Literature
te_mpost libpng python gpp libgpp gettext autoconf netpbm libnetpb
gs_serv gs_lib gs_fonts guile
+@subsection Slackware
+
+Problems have been reported with Slackware 7.0; apparently, it ships
+with a faulty compiler. Do not compile LilyPond with -O2 on this
+platform.
+
@subsection Mandrake
[TODO]
@macro separate
@tex
-\\hbox to\\hsize{\\hfill$\\heartsuit$\\hfill}
+\\hbox to\\hsize{\\hfill\\vrule width1.4 cm height1.0pt\\hfill}
@end tex
@end macro
@c \heartsf was supposed to be filled?
-@c center is broken?
-@ifnottex
-@macro braakseparate
-
-@center ***
-
-@end macro
-@end ifnottex
+@c center*** is broken?
@ifinfo
@macro separate
This manual was written to help you learn LilyPond, but as you might
imagine, we ourselves don't have much to learn about it. We can't
really judge whether the manual is helpful for users, but maybe you can!
-So should you find any part of the manual vague, unclear or outdated,
-please let us know.
+Don't hesitate to tell us if you find any part of the manual vague,
+unclear or outdated.
Han-Wen and Jan
Ending a staff or score with grace notes may also generate a run-time
error, since there will be no main note to attach the grace notes to.
-Combining grace notes and clef changes will prints note heads on
-erroneous vertical positions.
-
The present implementation of grace notes is not robust and generally
kludgey. We expect it to change after LilyPond 1.4. Syntax changes might
also be implemented.
-
-
@menu
* Glissando ::
* Dynamics::
is to be expected that more functionality -- especially for the MIDI
backend -- will be implemented at some point in the future.
+Volta repeats are printed over all staffs in a score. You must turn them
+off explicitly, for example by doing
+@example
+ \property Staff.VoltaBracket = \turnOff
+@end example
+
@node Manual repeat commands
@subsection Manual repeat commands
@c TODO: LilyPond Lilypond lilypond
+
@node Tutorial
@chapter Tutorial
-LilyPond prints music from a specification that you, the user, supply.
-You have to give that specification using a textual @emph{language}.
-This chapter is a gentle introduction to that language.
-
-[rewrite]
-@c gentle?
-@c the first section is gentle
-@c the later sections get rather high-brow, deep, detailed, thorough
-
-
-This tutorial will demonstrate how to use Lilypond by presenting
-examples of input along with resulting output. We will use English
-terms for notation. In case you are not familiar with those, you may
-consult the glossary that is distributed with LilyPond.
-
@menu
-* Music language of LilyPond::
* Running LilyPond:: Getting started
+* First steps::
* The first tune:: The first tune
* Lyrics and chords:: Lyrics and chords
* More movements ::
* end of tutorial:: The end
@end menu
-@node Music language of LilyPond
-@section Music language of LilyPond
-
-
-simple notes
-@lilypond[verbatim, relative 1]
-a b c
-@end lilypond
-
-alterations
-@lilypond[verbatim, relative 0]
-fis as cisis beses
-@end lilypond
-
-durations
-@lilypond[verbatim, relative 1]
-a1 a2 a8 a4 a16 a8. a16
-@end lilypond
-
-octaves: high quote, low quote (comma)
-@lilypond[verbatim, relative 1]
-c c, c''
-@end lilypond
-
-@c normal use of LilyPond is \relative note entry
-@c so let's just show/explain that and make smart
-@c people look for non-\relative
-
-lilypond chooses nearest note
-@lilypond[verbatim, relative 1]
-c f c g c
-@end lilypond
-
-to go other way: add octaviation quote
-@lilypond[verbatim, relative 1]
-c f, c' g, c'
-@end lilypond
-
-rests and skips
-@lilypond[verbatim, relative 1]
-r2 s4 r4
-@end lilypond
-
-
-meter
-@c \time -> \meter ?
-@lilypond[verbatim, relative 1]
-\time 3/4 c c c | R1 * 3/4
-@end lilypond
-
-key
-@lilypond[verbatim, relative 0]
-\key f \major es as bes
-@end lilypond
-
-slur, tie, phrasing slur
-@lilypond[verbatim, relative 1]
-c\( ( ) d ~ d \) c
-@end lilypond
-
-simple chords
-@lilypond[verbatim, relative 1]
-<a c> <b d> <c e>
-@end lilypond
-
-suddenly lilypond gets really difficult:
-[explain about score -> \score and \notes]
-
-long chords; simultaneous music
-@lilypond[verbatim]
-% huh?
-% \singleLine
-% \paper { \singleLine }
-\paper { linewidth = -1.0 }
-\score {
- \context Staff \notes \relative c'' <
- { a b c }
- { c d e }
- >
-}
-@end lilypond
-
-@lilypond[verbatim]
-\paper { linewidth = -1.0 }
-\score {
- \context GrandStaff \notes \relative c' <
- { a' b c }
- { \clef bass c d e }
- >
-}
-@end lilypond
-
@node Running LilyPond
@section Running LilyPond
-Before we dive into describing the input language of LilyPond, we first
-show you through the procedure for getting notes on your screen and out
-of your printer.
-
-The first step is creating an input file. Using your favorite
-text-editor, create @file{test.ly} containing
-
-@ignore
-
-NOTE: if you're reading this, ie, the Texinfo source itself, test.ly
-should of course contain:
-
- \score{
- \notes { c'4 e' g' }
- }
-
-@end ignore
-
+You make music notation with LilyPond as follows: first you edit a text
+file containing a description of the notes. Then you run LilyPond on the
+file. This leaves you with an output file, which you can view or print.
+
+In this section we explain how to run LilyPond, and view or print the
+output. If you want to test your setup of LilyPond, or try to run an
+example file yourself, then read this section. Otherwise, you can skip
+to the next section, which explains how to
+write LilyPond input.
+
+The instructions that follow are for Unix. Windows instructions are
+given at the end of this section. Start with opening a terminal window,
+and start up a text editor. For example, start an xterm and execute
+@code{joe}. Enter the following
+input, and save the file as @file{test.ly}.
@example
\score @{
\notes @{ c'4 e' g' @}
@}
@end example
+If this code looks intimidating you, then don't worry, we explain all
+about it in the next section.
-@unnumberedsubsec Unix
-@cindex Unix, Running lilypond on
@cindex ly2dvi
-On unix, you invoke ly2dvi to compile your lilypond source file (you can
-omit the @code{.ly}):
+@c dit is dus raar, dat je ly2dvi draait om lelie te draaien
+@c (therefore name change proposal)
+Invoke the program @code{ly2dvi} to run lilypond on your source file:
@example
ly2dvi -P test
@end example
You will see the following on your screen:
-
@example
-GNU LilyPond 1.3.145
+GNU LilyPond 1.4.0
Now processing: `/home/fred/ly/test.ly'
Parsing...
Interpreting music...[1]
-Preprocessing elements...
-Calculating column positions... [2]
-paper output to test.tex...
-
-Analyzing test.tex...
-Running LaTeX...
-Running dvips...
-PS output to test.ps...
-DVI output to test.dvi...
+ @emph{ ... more interesting stuff ... }
+PS output to `test.ps'...
+DVI output to `test.dvi'...
@end example
-The results of the ly2dvi run are a ``DeVice Independent'' file
-(@file{test.dvi}) and a PostScript file (@file{test.ps}).
-
@cindex DVI file
-
@cindex Viewing music
@cindex xdvi
-@cindex .dvi
-
-To view the @code{test.dvi} output, run Xdvi (you may omit the
-@code{.dvi}):
+The results of the ly2dvi run are two files, @file{test.dvi} and
+@file{test.ps}. The PS file (@file{test.ps}) is the one you can
+print. You can view the PS file using the program ghostview. If a
+version of ghostview is installed on your system, one of these commands
+will produce a window with some music notation on your screen.
@example
-xdvi test
+kghostview test.ps
+ggv test.ps
+ghostview test.ps
+gv test.ps
@end example
+When you're satisfied with the result, you can print the PS file by
+clicking File/Print inside ghostview.
-@c FIXME: should we say anything on xdvi-gs interaction?
+The DVI file (@file{test.dvi}) contains the same sheet music in a
+different format. DVI files are more easily processed by the computer,
+so viewing them usually is quicker. Execute @code{xdvi test}
+to view the DVI file.
-You should see the following in a window next to some buttons.
-@lilypond
-\score {
- \notes { c'4 e' g' }
-}
-@end lilypond
+If your DVI viewer does not have a "Print" button, you can print the
+file by executing @code{lpr test.ps}.
-When you're satisfied with the result, you can print the
-PostScript file:
+@c volgende alinea schrappen?
+
+If you can't get the examples to print, then you should look into
+installing and configuring ghostscript. Refer to GhostScript's website
+at @uref{http://www.ghostscript.com}.
-@example
-lpr test.ps
-@end example
-If this does not make your printer produce a page of music, you should
-look into installing and configuring ghostscript. Refer to
-GhostScript's website at @uref{http://www.ghostscript.com}.
@cindex GhostScript
@cindex @code{lpr}
@cindex Printing output
-
@cindex PostScript
-@cindex .ps
-@unnumberedsubsec Windows
+Windows users start the terminal by clicking on the lilypond icon.
+Notepad is sufficient for editing the lilypond file. Viewing the PS file
+can be done with @code{gsview32 test.ps}. Viewing DVI files can be done
+with @code{yap test}. The "print" button in Yap will print files. You
+can also print from the command line by executing @code{gsview32 /s
+test.ps}
-On windows, you open a LilyPond shell, and then you invoke ly2dvi
-compile your lilypond source file, just like on Unix:
+@c titel?
-@example
-ly2dvi -P test
-@end example
+@node First steps
+@section First steps
-You will see the following on your screen:
+Let's try to explain this example:
-@c FIXME: leave this out, just refer to unix section?
-@c FIXME: commands run in dos shell: we can't redirect output
+The basics of any piece of music are notes.Notes are entered
+with letters @code{a} to @code{g} followed by a
+number that represents the duration: a @code{2} is a half note, a
+@code{4} is a quarter note. A period is used for augmentation dots, so
+entering @code{2.} gives a dotted half note.
@example
-GNU LilyPond 1.3.150
-Now processing: `/home/tim/ly/test.ly'
-Parsing...
-Interpreting music...[1]
-Preprocessing elements...
-Calculating column positions... [2]
-paper output to test.tex...
-
-This is TeX, Version 3.14159 (MiKTeX 2)
-LaTeX2e <2000/06/01>
-Babel <v3.6Z> and hyphenation patterns for english, french, german, ngerman, du
-mylang, nohyphenation, loaded.
-
-(test.latex (C:\cygwin\usr\windows\MiKTeX\tex\latex\base\article.cls
-Document Class: article 2000/05/19 v1.4b Standard LaTeX document class
-(C:\cygwin\usr\windows\MiKTeX\tex\latex\base\size10.clo))
-(C:\cygwin\usr\lilypond-1.3.150.jcn2\share\lilypond\tex\geometry.sty
-(C:\cygwin\usr\windows\MiKTeX\tex\latex\graphics\keyval.sty))
-(C:\cygwin\usr\windows\MiKTeX\tex\latex\base\inputenc.sty
-(C:\cygwin\usr\windows\MiKTeX\tex\latex\base\latin1.def))
-(C:\cygwin\usr\lilypond-1.3.150.jcn2\share\lilypond\tex\titledefs.tex)
-No file test.aux.
-(test.tex
-(C:\cygwin\usr\lilypond-1.3.150.jcn2\share\lilypond\tex\lilyponddefs.tex
-(C:\cygwin\usr\lilypond-1.3.150.jcn2\share\lilypond\tex\lilypond-latex.tex
-LaTeX definitions)
-(C:\cygwin\usr\lilypond-1.3.150.jcn2\share\lilypond\tex\feta20.tex)
-(C:\cygwin\usr\lilypond-1.3.150.jcn2\share\lilypond\tex\lily-ps-defs.tex)
-[footer empty]))
-Overfull \hbox (15.0pt too wide) in paragraph at lines 20--24
-[] $[]$
-
-Overfull \vbox (0.7539pt too high) has occurred while \output is active
-[1] (test.aux) )
-(see the transcript file for additional information)
-Output written on test.dvi (1 page, 4292 bytes).
-Transcript written on test.log.
-This is dvips(k) 5.86 Copyright 1999 Radical Eye Software (www.radicaleye.com)
-' TeX output 2001.04.25:0015' -> test.ps
-<texc.pro><special.pro>. [1]
-Running LilyPond...
-Analyzing test.tex...
-PS output to test.ps...
-DVI output to test.dvi...
-@end example
-
-To view the @code{test.dvi} output, run Yap
+ c2 e4 g2.
+@end example
+@lilypond[fragment]
+\property Score.timing = ##f
+\property Staff.TimeSignature = \turnOff
+\property Staff.Clef = \turnOff
+\clef bass c2 e4 g2.
+@end lilypond
+If you don't specify a duration, then the duration last entered is used:
+@c
+@example
+ f4 e d c2.
+@end example
+@lilypond[fragment]
+\property Score.timing = ##f
+\property Staff.TimeSignature = \turnOff
+\property Staff.Clef = \turnOff
+\clef bass f4 e d c2.
+@end lilypond
+The time signature can be set with a command of the form @code{\time},
+and the clef with @code{\clef} as follows:
+@example
+ \time 3/4
+ \clef bass
+@end example
+@lilypond[fragment]
+ \time 3/4
+ \clef bass
+ s2._" "
+@end lilypond
+The commands together with the notes are combined to form a snippet of
+music. They are combined by enclosing them with @code{\notes @{ @}}.
@example
-yap test
+ \notes @{
+ \time 3/4
+ \clef bass
+ c2 e4 g2.
+ f4 e d c2.
+ @}
@end example
-You should see the following in a window
-@lilypond
+This snippet is ready to be printed. This is done by combining the music
+with a printing command. The printing command is the so-called
+@code{\paper} block. The music and paper block are combined by
+enclosing them in @code{\score}.
+
+@lilypond[verbatim]
\score {
- \notes { c'4 e' g' }
-}
+ \notes {
+ \time 3/4
+ \clef bass
+ c2 e4 g2.
+ f4 e d c2.
+ }
+ \paper { }
+}
@end lilypond
-@c FIXME: talk about newer Yap versions, proper gs installation?
-When you're satisfied with the result, you can print from within Yap
-(File/Print). Note that Yap may not display embedded PostScript symbols
-such as beams and slurs. Don't worry, they'll be printed anyway.
+@ignore
+The @code{\paper} block looks empty, which means that we get default. That is because we did not contains page layout settings, such as the linewidth and
+the staff size. For now, we'll use standard settings, hence the paper
+block is empty (its braces enclose a blank space).
+@end ignore
-You can also print the PostScript file directly from the
-command line using GSview:
+Rests are entered just like notes with the name @code{r}
+@lilypond[fragment,verbatim]
+r4 r8 r16
+@end lilypond
-@example
-gsview32 /s test.ps
-@end example
+Octaves are entered by adding apostrophes or commas to note names. For
+example, the central C is entered as @code{c'}.
+
+Pitches can be octaviated by adding apostrophes or commas. The central C is
+@code{c'}. Going up octave by octave we get @code{c''},
+@code{c'''}. Going down from central C, we get @code{c} @code{c,}
+@code{c,,} etc.
+
+@lilypond[verbatim,fragment]
+c'4 c'' c''' c c,
+@end lilypond
+
+LilyPond uses Dutch note names: you can make a note sharp by appending
+@code{is} to the name, and flat by appending @code{es} to the name.
+@lilypond[verbatim,fragment]
+fis'4 bes'4 aeses'4
+@end lilypond
+
+Ties are created by entering a tilde (@code{~}) between the notes to be
+tied:
+@lilypond[fragment,verbatim]
+ g'4 ~ g' a'2 ~ a'4
+@end lilypond
+Ties look almost the same as slurs, but they are different. Ties can
+only indicate the extension of a note. Ties connect two note heads with
+the same pitch. Slurs on the other hand, can be drawn across many
+notes, and indicate bound articulation.
+
+The key signature is set with the command @code{\key}:
+@lilypond[fragment,verbatim]
+ \key d \major
+ g'1
+ \key c \minor
+ g'
+@end lilypond
+
+The next example shows octave marks, ties, and rests in action.
+@lilypond[verbatim]
+\score {
+ \notes {
+ \time 4/4
+ \clef treble
+ \key d \minor
+ r4 r8 d''8 cis''4 e''
+ d''8 a'4. ~ a' b'8
+ cis''4 cis''8 cis'' bis'4 d''8 cis'' ~
+ cis''2 r2
+ }
+ \paper { }
+}
+@end lilypond
+There is one interesting point to note in this example: accidentals
+don't have to be marked explicitly. You just enter the pitch, and
+LilyPond determines wether or not to print an accidental.
+
+Managing larger pieces.
+
+If you look at the last piece, it is already apparent that entering
+octaves using quotes is not very convenient. A score written in high
+register will be encoded using lots quotes. This makes the input file
+unreadable, and it also is a source of many errors.
+
+This problem is solved by relative octave mode. In this mode, the quotes
+are used to mark large jumps in the melody. Without any quotes or
+commas, the interval between a note and its predecessor is assumed to be
+a fourth or less. Quotes and commas add octaves in up and down
+direction. Relative octaves are introduced by @code{\relative} followed
+by a starting pitch
+@lilypond[fragment,verbatim]
+\relative c'' { c4 d4 b4 e4 a,4 f'4 g,4 a'4 }
+@end lilypond
+
+Slurs (not to be confused with ties) are entered with parentheses. You
+mark the starting note and ending note with a @code{(} and a
+@code{)} respectively.
+
+@lilypond[fragment,relative 2, verbatim]
+c8( cis d ) e
+@end lilypond
+
+If you need two slurs at the same time (one for articulation, one for
+phrasing), you can also make phrasing slurs with @code{\(} and
+@code{\)}.
+
+@c lousy example
+@lilypond[fragment,relative 1, verbatim]
+a8(\( ais b ) c cis2 b'2 a4 cis, \) c
+@end lilypond
+
+Beams are drawn automatically, but if you don't like the choices, you
+can enter beams by hand. Surround the notes to be grouped with @code{[}
+and @code{]}:
+@lilypond[fragment,relative 1, verbatim]
+[a8 ais] [d es r d]
+@end lilypond
+
+You can make more than one staff, by specifying @code{\context Staff} before
+snippets of music, and combining those snippets in @code{<} and
+@code{>}, as is demonstrated here:
+
+@lilypond[fragment,verbatim]
+< \context Staff = staffA { \clef treble c'' }
+ \context Staff = staffB { \clef bass c }
+>
+@end lilypond
+Here, @code{staffA} and @code{staffB} are names that you give to the
+staff. For now, it doesn't matter what names you give, as long as they
+are different.
+
+We can typeset a melody with two staffs now:
+
+@lilypond[verbatim]
+\score {
+ \notes
+ < \context Staff = staffA {
+ \time 3/4
+ \clef treble
+ \relative c'' { e2 ( d4 c2 b4 [a8 a] [b b] [g g] )a2. }
+ }
+ \context Staff = staffB {
+ \clef bass
+ c2 e4 g2.
+ f4 e d c2.
+ }
+ >
+ \paper {}
+}
+@end lilypond
+
+Notice that the time signature is specified in one melody staff only
+(the top staff), but is printed on both. LilyPond knows that the time
+signature should be the same for all staffs.
+
+[TODO add some more here
+
+
+* \header
+
+* dynamics , articulation
+
+* <chords>
+
+* identifiers?
+
+]
+
+This is the end of the simple tutorial. What follows is also a manual in
+tutorial-style, but it is much more in-depth, and alas more
+intimidating. You should read it if you want to know about the more
+advanced features of lilypond, such as producing orchestral scores and
+parts, fine tuning output, writing polyphonic music, etc.
@section The first tune
-@cindex examples, tutorial
+This tutorial will demonstrate how to use Lilypond by presenting
+examples of input along with resulting output. We will use English
+terms for notation. In case you are not familiar with those, you may
+consult the glossary that is distributed with LilyPond.
The examples discussed are included in the distribution, in the
-subdirectory @file{input/tutorial/}@footnote{When we refer
-to filenames, they are relative to the top directory of the source
-package. In binary installations you should look in your doc section,
-eg, @code{/usr/share/doc/lilypond1.3/examples/input/tutorial}
-@cindex file names
-}. We recommend that you experiment with writing Lilypond input
-yourself, to get a feel for how the program behaves.
-
+subdirectory @file{input/tutorial/}@footnote{When we refer to filenames,
+they are relative to the top directory of the source package. }
To demonstrate what LilyPond input looks like, we start off with a
Compiling for distributions
Red Hat Linux
SuSE
+ Slackware
Mandrake
Debian GNU/Linux
Problems
make web-doc
- Building the website requires some additional tools:
+ Building the website requires some additional tools:
* xpmtoppm (from the netpbm package: the Portable Bitmap Utilities).
The original is at the netpbm FTP site
The website will build without bib converter utility, but you will
not see our hypertextified bibliography.
+ * texinfo (a development release) The documentation will build with
+ texinfo-4.0, but if you want split html pages, you're best off
+ using the lates pretest version from texinfo-4.0b
+ (ftp://texinfo.org/texinfo/pretests/texinfo-4.0b.tar.gz) or
+ texinfo-4.0b (ftp://alpha.gnu.org/gnu/texinfo-4.0b.tar.gz)
Building LilyPond
==================
te_kpath te_mpost libpng python gpp libgpp gettext autoconf netpbm
libnetpb gs_serv gs_lib gs_fonts guile
+Slackware
+---------
+
+ Problems have been reported with Slackware 7.0; apparently, it ships
+with a faulty compiler. Do not compile LilyPond with -O2 on this
+platform.
+
Mandrake
--------
apt-get install lilypond1.3
+ Debian's tex installation is a bit short on memory, you may want to
+increase it like this:
+ --- /etc/texmf/texmf.cnf.dpkg Sun Jan 28 14:12:14 2001
+ +++ /etc/texmf/texmf.cnf Fri Apr 27 11:09:35 2001
+ @ -384,8 +384,8 @
+ main_memory.context = 1500000
+ main_memory.mpost = 1000000
+ main_memory = 263000 % words of inimemory available; also applies to inimf&mp
+ -extra_mem_top = 0 % extra high memory for chars, tokens, etc.
+ -extra_mem_bot = 0 % extra low memory for boxes, glue, breakpoints, etc.
+ +extra_mem_top = 100000 % extra high memory for chars, tokens, etc.
+ +extra_mem_bot = 100000 % extra low memory for boxes, glue, breakpoints, etc.
+
+ obj_tab_size.context = 256000
+
Alternatively, visit
* http://packages.debian.org/lilypond
New features in 1.4
-* Finale (.etf), PMX, Musedata and Mup import tools.
-
-* Point and click functionality using emacs and Xdvi.
-
-* Comprehensive documentation, including tutorial.
-
-* Self-documenting: generated internal documentation.
-* Includes an extensive glossary of musical terms.
+DESIGN
-* Improved design and implementation: Complete rewrite of the
-internals: LilyPond is smaller, cleaner, more flexible, etc.
- - More pervasive GUILE integration resulting in:
+* More pervasive GUILE integration resulting in improved design and
+implementation. LilyPond is smaller, cleaner, more flexible, etc.
- Improved speed with comparable memory footprint
- Improved robustness: Lily almost never crashes.
+ - Access to internal music representation
+
* New font selection scheme similar to Latex-NFSS.
-* Medieval notation features: clefs, custodes
+* Flexible formatting mechanism for musical texts.
+
+* Chordnames are now configurable in every respect
+
+* Part combining for orchestral scores and hymns: two voices are
+ combined into a staff automatically, including Solo/a2
+ indications as appropriate.
-* Piano pedal support, Arpeggios, Glissandi
-* MIDI: dynamics, tempo changes
+ERGONOMICS
-* Typography: More elegant slurs, aligned dynamics, text crescendos,
+* Point and click functionality using emacs and Xdvi.
+
+* Rewritten Emacs mode
+
+* Cleaned up syntax details
+
+* Comprehensive documentation, including a rewritten tutorial.
+
+* All properties have doc strings, and internal documentation is
+generated automatically.
+
+* Windows point-and-click installer
+
+
+NOTATION FEATURES
+
+* Piano pedals, Arpeggios, Glissandi, many more note head
+shapes, Medieval clefs, custodes.
* Better lyrics placement: Automatical phrasing, melisma alignment,
and stanza numbering.
-* Part combining for orchestral scores and hymns: two voices are
- combined into a staff automatically, including Solo/a2
- indications as appropriate.
+* Typography: More elegant slurs, aligned dynamics, text crescendos,
-* Chordnames are now configurable in every respect
+* Easy-play note heads
-* Easy-play notation
-* Finished ouverture Coriolan as full orchestral score example.
+MIDI
+
+* dynamics, tempo changes in the MIDI output
+
+
+MISC
+
+* Finale (.etf), PMX, Musedata and Mup import tools.
* Mutopia ports collection: easy accessible music archive.
* ASCIIScript: ASCII-art output
-* Translations into Japanese, French and Russian
-
-* Many bugfixes.
+* Improved standalone postscript layout.
+* Translations into Japanese, French and Russian
-Removed features
+* Many many many bugfixes.
-* margin shape
PACKAGE_NAME=LilyPond
MAJOR_VERSION=1
MINOR_VERSION=3
-PATCH_LEVEL=151
-MY_PATCH_LEVEL=jcn3
+PATCH_LEVEL=152
+MY_PATCH_LEVEL=
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
\version "1.3.146"
+
+
\score
{
\notes \relative c'' {
@end quotation
You mean like this. (Sorry 'bout the nuked indentation.)
+
+Modified to use the standard transpose mechanism. The question is
+how useful these enharmonic modifications are. Mats B.
@end example
"
}
((eq? a -2) (set! a 0) (set! n (- n 1))))
(if (< n 0) (begin (set! o (- o 1)) (set! n (+ n 7))))
- (if (> n 7) (begin (set! o (+ o 1)) (set! n (- n 7))))
+ (if (> n 6) (begin (set! o (+ o 1)) (set! n (- n 7))))
(make-pitch o n a)))
-#(define (smart-transpose music pitch)
+#(define (simplify music)
(let* ((es (ly-get-mus-property music 'elements))
(e (ly-get-mus-property music 'element))
(p (ly-get-mus-property music 'pitch))
(if (pair? es)
(ly-set-mus-property
music 'elements
- (map (lambda (x) (smart-transpose x pitch)) es)))
+ (map (lambda (x) (simplify x)) es)))
(if (music? alts)
(ly-set-mus-property
music 'alternatives
- (smart-transpose alts pitch)))
+ (simplify alts)))
(if (music? body)
(ly-set-mus-property
music 'body
- (smart-transpose body pitch)))
+ (simplify body)))
(if (music? e)
(ly-set-mus-property
music 'element
- (smart-transpose e pitch)))
+ (simplify e)))
(if (pitch? p)
(begin
- (set! p (unhair-pitch (Pitch::transpose p pitch)))
+ (set! p (unhair-pitch p))
(ly-set-mus-property music 'pitch p)))
music))
-
music = \notes \relative c' { c4 d e f g a b c }
\score {
\notes \context Staff {
\transpose ais' \music
- \apply #(lambda (x) (smart-transpose x (make-pitch 0 5 1)))
- \music
+ \apply #simplify \transpose ais' \music
}
\paper { linewidth = -1. }
}
--- /dev/null
+
+\score {
+ \notes {
+ \time 4/4
+ \clef treble
+ \key d \minor
+ r4 r8 d''8 cis''4 e''4
+ d''8 a'4. ~ a'4. b'8
+ cis''4 cis''8 cis''8 bis'4 d''8 cis'' ~
+ cis''2 r2
+
+ }
+ \paper { }
+}
+
-
-
-\header {
- title = "Test"
-}
-
-
\score {
\notes { c'4 e'4 g'4 }
- \paper { }
}
if (ok)
{
- error (_f ("Error parsing AFM file: %s", nm.ch_C ()));
+ error (_f ("Error parsing AFM file: `%s'", nm.ch_C ()));
exit (2);
}
fclose (f);
SCM prev_cpos_;
SCM prev_octavation_;
void create_clef ();
- void set_central_c (SCM, SCM, SCM);
void set_glyph ();
void inspect_clef_properties ();
};
prev_cpos_ = prev_glyph_ = SCM_BOOL_F;
}
-void
-Clef_engraver::set_central_c (SCM glyph,SCM clefpos, SCM octavation)
-{
- prev_cpos_ = clefpos;
- prev_glyph_ = glyph;
- prev_octavation_ = octavation;
-
- SCM p = get_property ("clefPitches");
- int c0_position = 0;
- if (gh_list_p (p))
- {
- SCM found = scm_assoc (glyph, p);
- if (found == SCM_BOOL_F)
- {
- c0_position =0;
- }
- else
- {
- c0_position = gh_scm2int (gh_cdr (found));
-
- if (gh_number_p (octavation))
- c0_position -= gh_scm2int (octavation);
-
- if (gh_number_p (clefpos))
- c0_position += gh_scm2int (clefpos);
- }
-
- }
- daddy_trans_l_->set_property ("centralCPosition", gh_int2scm (c0_position));
-}
-
void
Clef_engraver::set_glyph ()
{
)
{
set_glyph ();
- set_central_c (glyph, clefpos, octavation);
-
create_clef ();
clef_p_->set_grob_property ("non-default", SCM_BOOL_T);
+
+ prev_cpos_ = clefpos;
+ prev_glyph_ = glyph;
+ prev_octavation_ = octavation;
+
}
if (to_boolean (force_clef))
}
}
+
void
Clef_engraver::stop_translation_timestep ()
{
{
public:
static void add_spacing_unit (Grob*me, Item*);
+ static void find_rods (Item*, SCM);
static void set_interface (Grob*);
+ static bool has_interface (Grob*);
DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM ));
};
Paper_def::paper_outputter_p ()
{
String outname = outname_str ();
- progress_indication (_f ("paper output to %s...",
+ progress_indication (_f ("paper output to `%s'...",
outname == "-" ? String ("<stdout>") : outname));
target_str_global_array.push (outname);
{
if (filename != "-")
filename += String (".") + key;
- progress_indication (_f ("writing header field %s to %s...",
+ progress_indication (_f ("writing header field `%s' to `%s'...",
key,
filename == "-" ? String ("<stdout>") : filename));
out = p.str ();
Midi_stream midi_stream (out);
- progress_indication (_f ("MIDI output to %s...", out));
+ progress_indication (_f ("MIDI output to `%s'...", out));
target_str_global_array.push (out);
output (midi_stream);
{
if (!p->start_req_l_)
{
- p->req_l_drul_[STOP]->origin ()->warning (_f ("can't find start of piano pedal: %s", p->name_));
+ p->req_l_drul_[STOP]->origin ()->warning (_f ("can't find start of piano pedal: `%s'", p->name_));
}
else
{
{
if (!p->start_req_l_)
{
- p->req_l_drul_[STOP]->origin ()->warning (_f ("can't find start of piano pedal: %s", p->name_));
+ p->req_l_drul_[STOP]->origin ()->warning (_f ("can't find start of piano pedal: `%s'", p->name_));
}
else
{
{
if (!p->start_req_l_)
{
- p->req_l_drul_[STOP]->origin ()->warning (_f ("can't find start of piano pedal: %s", String (p->name_)));
+ p->req_l_drul_[STOP]->origin ()->warning (_f ("can't find start of piano pedal: `%s'", String (p->name_)));
}
else
{
SCM meta = e->get_grob_property ("meta");
SCM name = scm_assoc (ly_symbol2scm ("name"), meta);
- warning (_f ("%s is deprecated. Use\n \\property %s.%s \\override #'%s = #%s",
+ warning (_f ("`%s' is deprecated. Use\n \\property %s.%s \\override #'%s = #%s",
ly_symbol2string (prop_sym).ch_C (),
origin->type_str_.ch_C (),
ly_scm2string (gh_cdr (name)).ch_C (),
{
const int WRAPWIDTH = 65;
- progress_indication (_f ("dependencies output to %s...", fn.ch_C ()));
+ progress_indication (_f ("dependencies output to `%s'...", fn.ch_C ()));
progress_indication ("\n");
ofstream f (fn.ch_C ());
if (!f)
#include "dimensions.hh"
#include "group-interface.hh"
-static void
-do_rod (Item *l, Item *r)
+void
+Separating_group_spanner::find_rods (Item * r, SCM next)
{
- Rod rod;
-
- Interval li (Separation_item::my_width (l));
Interval ri (Separation_item::my_width (r));
+ if (ri.empty_b ())
+ return;
+
+ /*
+ This is an inner loop, however, in most cases, the interesting L
+ will just be the first entry of NEXT, making it linear in most of
+ the cases. */
+ for(; gh_pair_p (next); next = gh_cdr (next))
+ {
+ Item *l = dynamic_cast<Item*> (unsmob_grob (gh_car( next)));
+ Item *lb = l->find_prebroken_piece (RIGHT);
+
+ if (lb)
+ {
+ Interval li (Separation_item::my_width (lb));
- rod.item_l_drul_[LEFT] =l;
- rod.item_l_drul_[RIGHT]=r;
+ if (!li.empty_b ())
+ {
+ Rod rod;
- if (li.empty_b () || ri.empty_b ())
- rod.distance_f_ = 0;
- else
- rod.distance_f_ = li[RIGHT] - ri[LEFT];
+ rod.item_l_drul_[LEFT] = lb;
+ rod.item_l_drul_[RIGHT] = r;
- rod.columnize ();
- rod.add_to_cols ();
+ rod.distance_f_ = li[RIGHT] - ri[LEFT];
+
+ rod.columnize ();
+ rod.add_to_cols ();
+ }
+ }
+
+ Interval li (Separation_item::my_width (l));
+ if (!li.empty_b ())
+ {
+ Rod rod;
+
+ rod.item_l_drul_[LEFT] =l;
+ rod.item_l_drul_[RIGHT]=r;
+
+ rod.distance_f_ = li[RIGHT] - ri[LEFT];
+
+ rod.columnize ();
+ rod.add_to_cols ();
+
+ break;
+ }
+ else
+ /*
+ this grob doesn't cause a constraint. We look further until we
+ find one that does. */
+ ;
+ }
}
-
+
MAKE_SCHEME_CALLBACK (Separating_group_spanner,set_spacing_rods,1);
SCM
Separating_group_spanner::set_spacing_rods (SCM smob)
/*
Order of elements is reversed!
*/
- SCM elt = gh_cadr (s);
- SCM next_elt = gh_car (s);
+ SCM elt = gh_car (s);
+ Item *r = dynamic_cast<Item*> (unsmob_grob (elt));
- Item *l = dynamic_cast<Item*> (unsmob_grob (elt));
- Item *r = dynamic_cast<Item*> (unsmob_grob (next_elt));
-
- if (!r || !l)
+ if (!r)
continue;
-
- Item *lb
- = dynamic_cast<Item*> (l->find_prebroken_piece (RIGHT));
Item *rb
= dynamic_cast<Item*> (r->find_prebroken_piece (LEFT));
- do_rod (l, r);
- if (lb)
- {
- do_rod (lb, r);
- }
-
+ find_rods (r, gh_cdr (s));
if (rb)
- {
- do_rod (l, rb);
- }
-
- if (lb && rb)
- {
- do_rod (lb, rb);
-
- }
+ find_rods (rb, gh_cdr (s));
}
/*
void
Separating_group_spanner::set_interface (Grob*)
{
+}
+bool
+Separating_group_spanner::has_interface (Grob*)
+{//todo
+ assert (false);
}
Separating_line_group_engraver::initialize ()
{
sep_span_p_ = new Spanner (get_property ("SeparatingGroupSpanner"));
- Separating_group_spanner::set_interface (sep_span_p_);
+
announce_grob (sep_span_p_, 0);
sep_span_p_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
}
me->add_dependency (b);
}
-MAKE_SCHEME_CALLBACK (Span_bar,brew_molecule,1);
-
-/**
- * Limitations/Bugs:
- *
- * (1) Elements from 'me->get_grob_property ("elements")' must be
- * ordered according to their y coordinates relative to their common
- * axis group parent. Otherwise, the computation goes mad. (TODO:
- * apply a sort algorithm that ensures this precondition.) However,
- * until now, I have seen no case where lily has not fulfilled this
- * precondition.
- *
- * (2) This method depends on bar_engraver not being removed from
- * staff context. If bar_engraver is removed, the size of the staff
- * lines is evaluated as 0, which results in a solid span bar line
- * with faulty y coordinate.
- *
- */
-SCM
-Span_bar::brew_molecule (SCM smobbed_me)
-{
- Grob *me = unsmob_grob (smobbed_me);
- Span_bar::evaluate_glyph(me);
- SCM glyph = me->get_grob_property (ly_symbol2scm ("glyph"));
- String glyph_str = ly_scm2string (glyph);
- SCM first_elt = me->get_grob_property ("elements");
-
- // first walk: compute axis_group parent via common_refpoint () on all bars
- Grob *refpoint = 0;
- int staff_bar_count = 0;
- for (SCM elts = first_elt;
- elts != SCM_EOL;
- elts = gh_cdr (elts))
- {
- SCM smobbed_staff_bar = gh_car (elts);
- Grob *staff_bar = unsmob_grob (smobbed_staff_bar);
- refpoint = (staff_bar_count > 0) ?
- staff_bar->common_refpoint (refpoint, Y_AXIS) :
- staff_bar;
- staff_bar_count++;
- }
- /* assert: refpoint is an axis-group object */
- Grob *axis_group = refpoint;
-
- // second walk: collect span bar components;
- // compute extent of axis_group
- Real last_staff_bar_length;
- Real *interstaff_bar_length = new Real[staff_bar_count];
- Real *interstaff_bar_yoffs = new Real[staff_bar_count];
- Molecule *interstaff_bar_molecule = new Molecule[staff_bar_count];
- Real axis_group_extent = 0.0;
- staff_bar_count = 0;
- for (SCM elts = first_elt;
- elts != SCM_EOL;
- elts = gh_cdr (elts))
- {
- SCM smobbed_staff_bar = gh_car (elts);
- SCM smobbed_staff_bar_molecule =
- Bar::brew_molecule (smobbed_staff_bar);
- Grob *staff_bar = unsmob_grob (smobbed_staff_bar);
- interstaff_bar_yoffs[staff_bar_count] =
- staff_bar->relative_coordinate (axis_group, (Axis)Y_AXIS);
- if (smobbed_staff_bar_molecule != SCM_EOL)
- {
- Real staff_bar_length =
- unsmob_molecule (smobbed_staff_bar_molecule)->
- extent (Y_AXIS).length ();
- if (staff_bar_count > 0)
- {
- // clone bar_molecule and fix y extent
- interstaff_bar_length[staff_bar_count] =
- interstaff_bar_yoffs[staff_bar_count] -
- interstaff_bar_yoffs[staff_bar_count - 1] -
- last_staff_bar_length;
- SCM smobbed_interstaff_bar_molecule =
- Bar::compound_barline (staff_bar, glyph_str,
- interstaff_bar_length[staff_bar_count]).
- smobbed_copy ();
- interstaff_bar_molecule[staff_bar_count] =
- *unsmob_molecule (smobbed_interstaff_bar_molecule);
- }
- else
- {
- interstaff_bar_molecule[staff_bar_count] = Molecule::Molecule ();
- }
- last_staff_bar_length = staff_bar_length;
- }
- else
- {
- last_staff_bar_length = 0;
- interstaff_bar_length[staff_bar_count] = 0;
- interstaff_bar_molecule[staff_bar_count] = Molecule::Molecule ();
- }
- axis_group_extent += last_staff_bar_length;
- axis_group_extent += interstaff_bar_length[staff_bar_count];
- staff_bar_count++;
- }
- // assert(abs(axis_group_extent -
- // axis_group->extent (axis_group, Y_AXIS).length ()) < EPSILON);
-
- // third walk: correct y axis on all span bar components;
- // put all components into a single span bar molecule
- Molecule span_bar_molecule = Molecule::Molecule ();
- staff_bar_count = 0;
- for (SCM elts = first_elt;
- elts != SCM_EOL;
- elts = gh_cdr (elts))
- {
- interstaff_bar_yoffs[staff_bar_count] +=
- (axis_group_extent - interstaff_bar_length[staff_bar_count]) / 2;
- interstaff_bar_molecule[staff_bar_count].//DEBUG
- translate_axis (-1.0 PT, X_AXIS);//DEBUG
- interstaff_bar_molecule[staff_bar_count].
- translate_axis (interstaff_bar_yoffs[staff_bar_count], Y_AXIS);
- span_bar_molecule.add_molecule (interstaff_bar_molecule[staff_bar_count]);
- staff_bar_count++;
- }
-
- // clean-up & exit
- delete interstaff_bar_length;
- delete interstaff_bar_yoffs;
- delete interstaff_bar_molecule;
- return span_bar_molecule.smobbed_copy ();
-}
-
MAKE_SCHEME_CALLBACK (Span_bar,width_callback,2);
SCM
Span_bar::width_callback (SCM element_smob, SCM scm_axis)
if (type_p != SCM_EOL && !gh_procedure_p (type_p))
{
- warning (_f ("Can't find property type-check for `%s'. Perhaps you made a typing error?",
+ warning (_f ("Can't find property type-check for `%s'. Perhaps you made a typing error? Doing assignment anyway.",
ly_symbol2string (sym).ch_C ()));
}
else
voltaVisibility = ##t
% name, glyph id, clef position
% where is c0 in this clef?
- clefPitches = #'(("clefs-G" . -4)
- ("clefs-C" . 0)
- ("clefs-F" . 4)
- ("clefs-vaticana_do" . 0)
- ("clefs-vaticana_fa" . 4)
- ("clefs-medicaea_do" . 0)
- ("clefs-medicaea_fa" . 4)
- ("clefs-hufnagel_do" . 0)
- ("clefs-hufnagel_fa" . 4)
- ("clefs-hufnagel_do_fa" . 0)
- ("clefs-mensural1_c" . 0)
- ("clefs-mensural2_c" . 0)
- ("clefs-mensural3_c" . 0)
- ("clefs-mensural1_f" . 4)
- ("clefs-mensural2_f" . 4)
- ("clefs-mensural_g" . -4))
clefGlyph = #"clefs-G"
clefPosition = #-2
-
+ centralCPosition = #-6
+
automaticPhrasing = ##t
alignmentReference = #-1 % \down
defaultBarType = #"|"
Begin3
Title: LilyPond
-Version: 1.3.151
-Entered-date: 27APR01
+Version: 1.3.152
+Entered-date: 04MAY01
Description: @BLURB@
Keywords: music notation typesetting midi fonts engraving
Author: hanwen@cs.uu.nl (Han-Wen Nienhuys)
janneke@gnu.org (Jan Nieuwenhuizen)
Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys)
Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert
- 1000k lilypond-1.3.151.tar.gz
+ 1000k lilypond-1.3.152.tar.gz
Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
- 1000k lilypond-1.3.151.tar.gz
+ 1000k lilypond-1.3.152.tar.gz
Copying-policy: GPL
End
%define info yes
Name: lilypond
-Version: 1.3.151
+Version: 1.3.152
Release: 1
License: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.151.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.152.tar.gz
Summary: Create and print music notation
URL: http://www.cs.uu.nl/~hanwen/lilypond
BuildRoot: /tmp/lilypond-install
Distribution: SuSE Linux 7.0 (i386)
Name: lilypond
-Version: 1.3.151
+Version: 1.3.152
Release: 2
Copyright: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.151.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.152.tar.gz
# music notation software for.. ?
Summary: A program for printing sheet music.
URL: http://www.lilypond.org/
#: ly2dvi.py:654 scores.cc:44
#, fuzzy, c-format
-msgid "dependencies output to %s..."
+msgid "dependencies output to `%s'..."
msgstr "Ausgabe auf Papier auf %s..."
#: ly2dvi.py:665
#, fuzzy, c-format
-msgid "%s output to %s..."
+msgid "%s output to `%s'..."
msgstr "MIDI-Ausgabe nach %s..."
#: includable-lexer.cc:49 lily-guile.cc:139 ly2dvi.py:667
#: mup2ly.py:1203
#, fuzzy, c-format
-msgid "Writing %s..."
+msgid "Writing `%s'..."
msgstr "Linie ... "
#: update-lily.py:46
#: paper-def.cc:109
#, fuzzy, c-format
-msgid "paper output to %s..."
+msgid "paper output to `%s'..."
msgstr "Ausgabe auf Papier auf %s..."
#: lilypond-stream.cc:93 paper-outputter.cc:85 performance.cc:99
#: paper-outputter.cc:232
#, fuzzy, c-format
-msgid "writing header field %s to %s..."
+msgid "writing header field `%s' to `%s'..."
msgstr "Schreibe Datei mit Abhängigkeiten: `%s'..."
#: paper-score.cc:80
#: performance.cc:168
#, c-format
-msgid "MIDI output to %s..."
+msgid "MIDI output to `%s'..."
msgstr "MIDI-Ausgabe nach %s..."
#: phrasing-slur-engraver.cc:119
#: lilypond-score.cc:108
#, c-format
-msgid "Lily output to %s..."
+msgid "Lily output to `%s'..."
msgstr "Lily-Ausgabe nach %s..."
#: lilypond-score.cc:119
#: ly2dvi.py:654 scores.cc:44
#, fuzzy, c-format
-msgid "dependencies output to %s..."
+msgid "dependencies output to `%s'..."
msgstr "Sortie papier vers %s..."
#: ly2dvi.py:665
#, fuzzy, c-format
-msgid "%s output to %s..."
+msgid "%s output to `%s'..."
msgstr "Sortie de Lily vers %s..."
#: includable-lexer.cc:49 lily-guile.cc:139 ly2dvi.py:667
#: mup2ly.py:1203
#, fuzzy, c-format
-msgid "Writing %s..."
+msgid "Writing `%s'..."
msgstr "Ligne ..."
#: update-lily.py:46
#: paper-def.cc:109
#, fuzzy, c-format
-msgid "paper output to %s..."
+msgid "paper output to `%s'..."
msgstr "Sortie papier vers %s..."
#: lilypond-stream.cc:93 paper-outputter.cc:85 performance.cc:99
#: paper-outputter.cc:232
#, fuzzy, c-format
-msgid "writing header field %s to %s..."
+msgid "writing header field `%s' to `%s'..."
msgstr "impossible d'ouvrir le fichier: `%s'"
#: paper-score.cc:80
#: performance.cc:168
#, c-format
-msgid "MIDI output to %s..."
+msgid "MIDI output to `%s'..."
msgstr ""
#: phrasing-slur-engraver.cc:119
#: lilypond-score.cc:108
#, c-format
-msgid "Lily output to %s..."
+msgid "Lily output to `%s'..."
msgstr "Sortie de Lily vers %s..."
#: lilypond-score.cc:119
#: ly2dvi.py:654 scores.cc:44
#, fuzzy, c-format
-msgid "dependencies output to %s..."
+msgid "dependencies output to `%s'..."
msgstr "L'output stampato è inviato a %s..."
#: ly2dvi.py:665
#, fuzzy, c-format
-msgid "%s output to %s..."
+msgid "%s output to `%s'..."
msgstr "L'output MIDI è inviato a %s..."
#: includable-lexer.cc:49 lily-guile.cc:139 ly2dvi.py:667
#: mup2ly.py:1203
#, fuzzy, c-format
-msgid "Writing %s..."
+msgid "Writing `%s'..."
msgstr "Genero le voci..."
#: update-lily.py:46
#: paper-def.cc:109
#, fuzzy, c-format
-msgid "paper output to %s..."
+msgid "paper output to `%s'..."
msgstr "L'output stampato è inviato a %s..."
#: lilypond-stream.cc:93 paper-outputter.cc:85 performance.cc:99
#: paper-outputter.cc:232
#, fuzzy, c-format
-msgid "writing header field %s to %s..."
+msgid "writing header field `%s' to `%s'..."
msgstr "scrivo il file delle dipendenze: `%s'..."
#: paper-score.cc:80
#: performance.cc:168
#, c-format
-msgid "MIDI output to %s..."
+msgid "MIDI output to `%s'..."
msgstr "L'output MIDI è inviato a %s..."
#: phrasing-slur-engraver.cc:119
#: lilypond-score.cc:108
#, c-format
-msgid "Lily output to %s..."
+msgid "Lily output to `%s'..."
msgstr "Output di Lily in %s..."
#: lilypond-score.cc:119
#: ly2dvi.py:654 scores.cc:44
#, fuzzy, c-format
-msgid "dependencies output to %s..."
+msgid "dependencies output to `%s'..."
msgstr "%s ¤Ø paper ½ÐÎÏ..."
#: ly2dvi.py:665
#, fuzzy, c-format
-msgid "%s output to %s..."
+msgid "%s output to `%s'..."
msgstr "%s ¤Ø¤Î MIDI ½ÐÎÏ"
#: includable-lexer.cc:49 lily-guile.cc:139 ly2dvi.py:667
#: mup2ly.py:1203
#, fuzzy, c-format
-msgid "Writing %s..."
+msgid "Writing `%s'..."
msgstr "¹Ô ..."
#: update-lily.py:46
#: paper-def.cc:109
#, c-format
-msgid "paper output to %s..."
+msgid "paper output to `%s'..."
msgstr "%s ¤Ø paper ½ÐÎÏ..."
#: lilypond-stream.cc:93 paper-outputter.cc:85 performance.cc:99
#: paper-outputter.cc:232
#, fuzzy, c-format
-msgid "writing header field %s to %s..."
+msgid "writing header field `%s' to `%s'..."
msgstr "°Í¸´Ø·¸¥Õ¥¡¥¤¥ë¤Î½ñ¤¹þ¤ß: `%s'..."
#: paper-score.cc:80
#: performance.cc:168
#, c-format
-msgid "MIDI output to %s..."
+msgid "MIDI output to `%s'..."
msgstr "%s ¤Ø¤Î MIDI ½ÐÎÏ"
#: phrasing-slur-engraver.cc:119
#: lilypond-score.cc:108
#, c-format
-msgid "Lily output to %s..."
+msgid "Lily output to `%s'..."
msgstr "Lily ¤Ï %s ¤Ë½ÐÎϤ·¤Þ¤¹..."
#: lilypond-score.cc:119
#: mup2ly.py:1203
#, c-format
-msgid "Writing %s..."
+msgid "Wwriting `%s'..."
msgstr ""
#: update-lily.py:46
#: ly2dvi.py:654 scores.cc:44
#, c-format
-msgid "dependencies output to %s..."
+msgid "dependencies output to `%s'..."
msgstr "afhankelijkheden uitvoer naar %s..."
#: ly2dvi.py:665
#, c-format
-msgid "%s output to %s..."
+msgid "%s output to `%s'..."
msgstr "%s uitvoer naar %s..."
#: includable-lexer.cc:49 lily-guile.cc:139 ly2dvi.py:667
#: mup2ly.py:1203
#, fuzzy, c-format
-msgid "Writing %s..."
+msgid "Writing `%s'..."
msgstr "Beëidigen ..."
#: update-lily.py:46
#: paper-def.cc:109
#, c-format
-msgid "paper output to %s..."
+msgid "paper output to `%s'..."
msgstr "papier uitvoer naar %s..."
#: lilypond-stream.cc:93 paper-outputter.cc:85 performance.cc:99
#: paper-outputter.cc:232
#, c-format
-msgid "writing header field %s to %s..."
+msgid "writing header field `%s' to `%s'..."
msgstr "Schijven van kop veld %s naar bestand %s..."
#: paper-score.cc:80
#: performance.cc:168
#, c-format
-msgid "MIDI output to %s..."
+msgid "MIDI output to `%s'..."
msgstr "MIDI uitvoer naar %s..."
#: phrasing-slur-engraver.cc:119
#: lilypond-score.cc:108
#, c-format
-msgid "Lily output to %s..."
+msgid "Lily output to `%s'..."
msgstr "Lelie uitvoer naar %s..."
#: lilypond-score.cc:119
#: ly2dvi.py:654 scores.cc:44
#, fuzzy, c-format
-msgid "dependencies output to %s..."
+msgid "dependencies output to `%s'..."
msgstr "\"ÂÕÍÁÖÎÙÊ\" ×Ù×ÏÄ × %s..."
#: ly2dvi.py:665
#, fuzzy, c-format
-msgid "%s output to %s..."
+msgid "%s output to `%s'..."
msgstr "×Ù×ÏÄ MIDI × %s..."
#: includable-lexer.cc:49 lily-guile.cc:139 ly2dvi.py:667
#: mup2ly.py:1203
#, fuzzy, c-format
-msgid "Writing %s..."
+msgid "Writing `%s'..."
msgstr "÷ÙÂÒÁÓÙ×ÁÀ ÍÕÚÙËÕ: `%s'"
#: update-lily.py:46
#: paper-def.cc:109
#, c-format
-msgid "paper output to %s..."
+msgid "paper output to `%s'..."
msgstr "\"ÂÕÍÁÖÎÙÊ\" ×Ù×ÏÄ × %s..."
#: lilypond-stream.cc:93 paper-outputter.cc:85 performance.cc:99
#: paper-outputter.cc:232
#, fuzzy, c-format
-msgid "writing header field %s to %s..."
+msgid "writing header field `%s' to `%s'..."
msgstr "úÁÐÉÓÙ×ÁÀ ÆÁÊÌ ÚÁ×ÉÓÉÍÏÓÔÅÊ: `%s'..."
#: paper-score.cc:80
#: performance.cc:168
#, c-format
-msgid "MIDI output to %s..."
+msgid "MIDI output to `%s'..."
msgstr "×Ù×ÏÄ MIDI × %s..."
#: phrasing-slur-engraver.cc:119
#: lilypond-score.cc:108
#, c-format
-msgid "Lily output to %s..."
+msgid "Lily output to `%s'..."
msgstr "Lily ×ÙÈÏÄ × %s..."
#: lilypond-score.cc:119
-;;
+
;; (name . (glyph clef-position octavation))
-;; -- the name clefOctavation is misleading the value 7 is 1 octave not 7 Octaves.
;;
+;; -- the name clefOctavation is misleading. The value 7 is 1 octave, not 7 Octaves.
+
(define supported-clefs '(
("treble" . ("clefs-G" -2 0))
("violin" . ("clefs-G" -2 0))
)
)
+; "an alist mapping GLYPHNAME to the position of the central C for that symbol")
+(define c0-pitch-alist
+ '(("clefs-G" . -4)
+ ("clefs-C" . 0)
+ ("clefs-F" . 4)
+ ("clefs-vaticana_do" . 0)
+ ("clefs-vaticana_fa" . 4)
+ ("clefs-medicaea_do" . 0)
+ ("clefs-medicaea_fa" . 4)
+ ("clefs-hufnagel_do" . 0)
+ ("clefs-hufnagel_fa" . 4)
+ ("clefs-hufnagel_do_fa" . 0)
+ ("clefs-mensural1_c" . 0)
+ ("clefs-mensural2_c" . 0)
+ ("clefs-mensural3_c" . 0)
+ ("clefs-mensural1_f" . 4)
+ ("clefs-mensural2_f" . 4)
+ ("clefs-mensural_g" . -4))
+ )
+
(define (clef-name-to-properties cl)
(let ((e '())
+ (c0 0)
(oct 0)
(l (string-length cl))
)
(set! e (assoc cl supported-clefs))
+
(if (pair? e)
`(((symbol . clefGlyph)
(iterator-ctor . ,Property_iterator::constructor)
(value . ,(cadr e))
)
-; ((symbol . forceClef)
-; (iterator-ctor . ,Property_iterator::constructor)
-; (value . #t)
-; )
-
+ ((symbol . centralCPosition)
+ (iterator-ctor . ,Property_iterator::constructor)
+ (value . ,(+ oct (caddr e) (cdr (assoc (cadr e) c0-pitch-alist))))
+ )
((symbol . clefPosition)
(iterator-ctor . ,Property_iterator::constructor)
(value . ,(caddr e))
(SpanBar . (
(break-align-symbol . Staff_bar)
(bar-size-procedure . ,Span_bar::get_bar_size)
- (molecule-callback . ,Span_bar::brew_molecule)
+ (molecule-callback . ,Bar::brew_molecule)
(visibility-lambda . ,begin-of-line-invisible)
(X-extent-callback . ,Span_bar::width_callback)
(Y-offset-callbacks . (,Span_bar::center_on_spanned_callback))
"Clef_engraver"
"Determine and set reference point for pitches"
'(Clef OctavateEight)
- '(
- clefPosition
- clefGlyph
- centralCPosition
- clefOctavation
- explicitClefVisibility
- clefPitches
-
- )))
+ '( clefPosition clefGlyph centralCPosition clefOctavation explicitClefVisibility )))
(cons
'A2_engraver
"Generate object to put grace notes from left to right."
'(GraceAlignment)
'(
-
graceAlignPosition
graceAccidentalSpace
)))
(translator-property-description 'clefGlyph string? "Name of the symbol within the music font")
(translator-property-description 'clefOctavation integer? "Add
this much extra octavation. Values of 7 and -7 are common.")
-(translator-property-description 'clefPitches list? "an alist mapping GLYPHNAME to the position of the central C for that symbol")
(translator-property-description 'clefPosition number? "Where should the center of the symbol go?")
(translator-property-description 'combineParts boolean? "try to combine parts?")
(translator-property-description 'connectArpeggios boolean? " If
n = i.tell ()
i.seek (0,0)
except:
- sys.stderr.write ("can't open file: %s\n" % f)
+ sys.stderr.write ("can't open file: `%s'\n" % f)
return ''
s = i.read (n)
if len (s) <= 0:
- sys.stderr.write ("gulped empty file: %s\n" % f)
+ sys.stderr.write ("gulped empty file: `%s'\n" % f)
i.close ()
return s
type = k[0:3]
if key_lookup.has_key(type):
return("%s \\%s" % ( key, key_lookup[type]))
- sys.stderr.write("Unknown key type %s ignored\n" % type)
+ sys.stderr.write("Unknown key type `%s' ignored\n" % type)
return key
def shift_key (note, acc , shift):
(str, num) = parse_num (str)
if not num:
num = 1
-
- if str[0] == '/':
- while str[:1] == '/':
- str= str[1:]
- d = 2
- if str[0] in DIGITS:
- (str, d) =parse_num (str)
+ if len(str):
+ if str[0] == '/':
+ if len(str[0]):
+ while str[:1] == '/':
+ str= str[1:]
+ d = 2
+ if str[0] in DIGITS:
+ (str, d) =parse_num (str)
- den = den * d
+ den = den * d
den = den * default_len
while str and artic_tbl.has_key(str[:1]):
state.next_articulation = state.next_articulation + artic_tbl[str[:1]]
if not artic_tbl[str[:1]]:
- sys.stderr.write("Warning: ignoring %s\n" % str[:1] )
+ sys.stderr.write("Warning: ignoring `%s'\n" % str[:1] )
str = str[1:]
if f == '-':
f = ''
- sys.stderr.write ('Parsing... [%s]\n' % f)
+ sys.stderr.write ('Parsing `%s\'...\n' % f)
parse_file (f)
if not out_filename:
out_filename = os.path.basename (os.path.splitext (f)[0]) + ".ly"
- sys.stderr.write ('Ly output to: %s...' % out_filename)
+ sys.stderr.write ('lilypond output to: `%s\'...' % out_filename)
outf = open (out_filename, 'w')
# dump_global (outf)
do_one_file (f)
except UnknownVersion:
sys.stderr.write ('\n')
- sys.stderr.write ("%s: can't determine version for %s" % (program_name, f))
+ sys.stderr.write ("%s: can't determine version for `%s'" % (program_name, f))
sys.stderr.write ('\n')
if assume_old:
fv = from_version
do_one_file (f)
from_version = fv
else:
- sys.stderr.write ("%s: skipping: %s " % (program_name, f))
+ sys.stderr.write ("%s: skipping: `%s' " % (program_name, f))
pass
sys.stderr.write ('\n')
# feta16.{afm,mf,tex,tfm}, and only set env upon failure.
#
environment = {
- 'MFINPUTS' : datadir + '/mf:',
- 'TEXINPUTS': datadir + '/tex:' + datadir + '/ps:.:',
- 'TFMFONTS' : datadir + '/tfm:',
+ 'MFINPUTS' : ':' + datadir + '/mf',
+ 'TEXINPUTS': ':' + datadir + '/tex:' + datadir + '/ps',
+ 'TFMFONTS' : ':' + datadir + '/tfm',
'GS_FONTPATH' : datadir + '/afm:' + datadir + '/pfa',
'GS_LIB' : datadir + '/ps',
}
for key in environment.keys ():
val = environment[key]
if os.environ.has_key (key):
- val = val + os.pathsep + os.environ[key]
+ val = os.environ[key] + os.pathsep + val
os.environ[key] = val
def identify ():
depfile = os.path.join (outdir, outbase + '.dep')
generate_dependency_file (depfile, depfile)
if os.path.isfile (depfile):
- progress (_ ("dependencies output to %s...") % depfile)
+ progress (_ ("dependencies output to `%s'...") % depfile)
for i in targets.keys ():
ext = string.lower (i)
if reldir != '.':
outname = os.path.join (reldir, outname)
if os.path.isfile (abs):
- progress (_ ("%s output to %s...") % (i, outname))
+ progress (_ ("%s output to `%s'...") % (i, outname))
elif verbose_p:
warning (_ ("can't find file: `%s'") % outname)