From f798a4c8737f0d279fcf54ba4f0951074565fa76 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Thu, 9 Mar 2000 13:24:54 +0100 Subject: [PATCH] release: 1.3.31 ========= * Fixed the page layout, reintroducing space for the header and trying to keep piece titles on the same page as the piece. The header and footer can now contain several lines. 1.3.30.j --- CHANGES | 42 +- Documentation/index.texi | 5 +- Documentation/ly2dvi.texi | 27 +- Documentation/midi2ly.texi | 8 +- Documentation/programmer/feta20.sty | 146 ---- Documentation/programmer/fonts.doc | 330 -------- .../programmer/lilypond-overview.doc | 743 ------------------ Documentation/programmer/musicnotes.sty | 43 - TODO | 580 +------------- VERSION | 4 +- flower/include/unionfind.hh | 26 - flower/unionfind.cc | 37 - input/test/crescendi.ly | 17 + input/test/span-dynamic.ly | 17 + lily/crescendo.cc | 57 +- lily/dynamic-engraver.cc | 103 ++- lily/tie-performer.cc | 9 +- lily/tie.cc | 3 +- ly/params.ly | 2 + ly/performer.ly | 2 + ly/property.ly | 1 + ly/spanners.ly | 20 + make/mutopia-targets.make | 1 - make/out/lilypond.lsm | 8 +- make/out/lilypond.spec | 4 +- ps/lily.ps | 15 +- scm/lily.scm | 18 + stepmake/stepmake/documentation-targets.make | 1 - .../stepmake/yolily-toplevel-targets.make | 4 +- 29 files changed, 257 insertions(+), 2016 deletions(-) delete mode 100644 Documentation/programmer/feta20.sty delete mode 100644 Documentation/programmer/fonts.doc delete mode 100644 Documentation/programmer/lilypond-overview.doc delete mode 100644 Documentation/programmer/musicnotes.sty delete mode 100644 flower/include/unionfind.hh delete mode 100644 flower/unionfind.cc create mode 100644 input/test/crescendi.ly create mode 100644 input/test/span-dynamic.ly diff --git a/CHANGES b/CHANGES index e36d3f8b07..9e57175791 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,20 @@ ---- ../lilypond-1.3.30.jcn1/CHANGES Tue Mar 7 23:59:44 2000 -++ b/CHANGES Wed Mar 8 15:35:43 2000 -@@ -1,3 +1,10 @@ +1.3.30.mb1 +========= + +* Fixed the page layout, reintroducing space for the header and + trying to keep piece titles on the same page as the piece. + The header and footer can now contain several lines. + +1.3.30.jcn3 +=========== + +* Span_dynamic_performer; perform crescendi/decrescendi. Bit scrappy. + +* Preliminary support for crescendi/decrescendi other than `hairpins', eg: + `cresc. poco `a poco -- -- --' + +* Tie performance fix. + 1.3.30.jcn2 =========== @@ -8,26 +22,24 @@ * David's comments on opus47 - 1.3.30.jcn1 - =========== - --- ../lilypond-1.3.30/CHANGES Mon Mar 6 12:10:00 2000 -++ b/CHANGES Tue Mar 7 23:59:44 2000 -@@ -1,3 +1,9 @@ 1.3.30.jcn1 =========== * More Coriolan: flute-1,2; oboe-1,2; clarinet-1,2; fixes and remainder french horn-1,2; trombone-1,2; fagotto-1,2; timpani; and several fixes. - - 1.3.29.hwn1 - ===========1.3.30.mb1 -========= + +1.3.30.uu1 +========== -* Fixed the page layout, reintroducing space for the header and - trying to keep piece titles on the same page as the piece. - The header and footer can now contain several lines. +* Remove some old doco from programmer/ and put on personal homepage. + +* Removed union-find from flower library. +* Only quantise tie horizontal part inside the staff. + +1.3.30 +====== 1.3.29.hwn1 =========== diff --git a/Documentation/index.texi b/Documentation/index.texi index 0e969c7132..1608ab2ad0 100644 --- a/Documentation/index.texi +++ b/Documentation/index.texi @@ -13,6 +13,7 @@ @item @uref{../topdocs/out-www/AUTHORS.html, Authors} @item @uref{../topdocs/out-www/README.html, Readme file} @item @uref{../topdocs/out-www/INSTALL.html, Installation instructions} +@item @uref{CHANGES.txt, Things recently done} @item @uref{faq.html,FAQ: Frequently asked questions}, with answers @end itemize @@ -32,15 +33,13 @@ integrating text and music in LaTeX and texinfo; also available in LilyPond prints @item @uref{midi2ly.html,midi2ly} manual. midi2ly converts MIDI files to LilyPond input -@item @uref{../programmer/out-www/index.html,Programmer documentation} +@item @uref{../programmer/out-www/regression-test.html, LilyPond test document} @end itemize @unnumberedsubsec Status @itemize @bullet -@item @uref{TODO.txt, Thing to do} -@item @uref{CHANGES.txt, Things recently done} @end itemize diff --git a/Documentation/ly2dvi.texi b/Documentation/ly2dvi.texi index 0a1d1681a3..d7cf664d12 100644 --- a/Documentation/ly2dvi.texi +++ b/Documentation/ly2dvi.texi @@ -2,23 +2,8 @@ @setfilename ly2dvi.info @settitle ly2dvi -@node Top, , , -@menu -* Ly2dvi DESCRIPTION:: Ly2dvi DESCRIPTION -* Ly2dvi SYNOPSIS:: Ly2dvi SYNOPSIS -* Ly2dvi OPTIONS:: Ly2dvi OPTIONS -* Ly2dvi Features:: Ly2dvi Features -* Ly2dvi Environment:: Ly2dvi Environment -* Ly2dvi Files:: Ly2dvi Files -* Ly2dvi Initialization Sequence::Ly2dvi Initialization Sequence -* Ly2dvi See Also:: Ly2dvi See Also -* Ly2dvi Bugs:: Ly2dvi Bugs -* Ly2dvi Remarks:: Ly2dvi Remarks -* Ly2dvi Authors:: Ly2dvi Authors -@end menu @chapter Ly2dvi -@node Ly2dvi DESCRIPTION, , , Top @section DESCRIPTION ly2dvi is a Python script which creates input file for LaTeX, based on information from the output files from LilyPond. @@ -32,12 +17,11 @@ one or more DVI files. The majority of this utility came from a bourne script written by Jan Arne Fagertun name @file{ly2dvi}. -@node Ly2dvi SYNOPSIS, , , Top @section SYNOPSIS ly2dvi [options] inputfile[.ly] [....] -@node Ly2dvi OPTIONS, , , Top + @section OPTIONS @table @samp @@ -85,7 +69,7 @@ Arne Fagertun name @file{ly2dvi}. DVI file for each. @end table -@node Ly2dvi Features, , , Top + @section Features ly2dvi responds to several parameters specified in the mudela @@ -104,7 +88,6 @@ file. They are overridden by corresponding command line options. Specify name of papersize. @end table -@node Ly2dvi Environment, , , Top @section Environment @table @samp @@ -116,7 +99,6 @@ file. They are overridden by corresponding command line options. Temporary directory name. Default is /tmp @end table -@node Ly2dvi Files, , , Top @section Files @file{titledefs.tex} is inspected for definitions used to extract @@ -218,7 +200,6 @@ present. Possible value is a valid directory specification that is writable to the user. @end table -@node Ly2dvi Initialization Sequence, , , Top @section Initialization Sequence The initialization process reads inputs for several sources. Below is a list of priorities for lowest to hightest proirity. @@ -236,12 +217,10 @@ a list of priorities for lowest to hightest proirity. Note that this differs slightly from the original bourne shell version. -@node Ly2dvi See Also, , , Top @section See Also lilypond(1), tex(1), latex(1) -@node Ly2dvi Bugs, , , Top @section Bugs If you have found a bug, you should send a bugreport. @@ -255,7 +234,6 @@ If you have found a bug, you should send a bugreport. to this mailinglist). @end itemize -@node Ly2dvi Remarks, , , Top @section Remarks Many papersizes are now supported. Information on other sizes @@ -268,7 +246,6 @@ a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, archA, archB, archC, archD, archE, b0, b1, b2, b3, b4, b5, flsa, flse, halfletter, ledger, legal, letter, note -@node Ly2dvi Authors, , , Top @section Authors Python Version author: @email{daboys@@austin.rr.com, Jeffrey B. Reed}, diff --git a/Documentation/midi2ly.texi b/Documentation/midi2ly.texi index 9c5fc161e1..7a4609d436 100644 --- a/Documentation/midi2ly.texi +++ b/Documentation/midi2ly.texi @@ -2,21 +2,15 @@ @setfilename midi2ly.info @settitle midi2ly -@node midi2ly, , , Top -@menu -* midi2ly DESCRIPTION:: midi2ly DESCRIPTION -* midi2ly OPTIONS:: midi2ly OPTIONS -@end menu + @chapter midi2ly -@node midi2ly DESCRIPTION, , , midi2ly @section DESCRIPTION midi2ly translates a MIDI input file to Mudela (GNU LilyPond source format). midi2ly is part of the GNU LilyPond music typesetting package. midi2ly [options] midi-file -@node midi2ly OPTIONS, , , midi2ly @section OPTIONS @table @samp diff --git a/Documentation/programmer/feta20.sty b/Documentation/programmer/feta20.sty deleted file mode 100644 index 0dbfcf90cc..0000000000 --- a/Documentation/programmer/feta20.sty +++ /dev/null @@ -1,146 +0,0 @@ -% Creator: mf-to-table.py version 0.7 -% Automatically generated on -% Do not edit -% input from out/feta20.log -% name -% rests -\fetdef\wholerest{0} -\fetdef\halfrest{1} -\fetdef\outsidewholerest{2} -\fetdef\outsidehalfrest{3} -\fetdef\breverest{4} -\fetdef\longarest{5} -\fetdef\multirest{6} -\fetdef\quartrest{7} -\fetdef\eighthrest{8} -\fetdef\sixteenthrest{9} -\fetdef\thirtysecondrest{10} -\fetdef\sixtyfourthrest{11} -\fetdef\hundredtwentyeighthrest{12} - -% accidentals -\fetdef\sharp{13} -\fetdef\natural{14} -\fetdef\flat{15} -\fetdef\flatflat{16} -\fetdef\sharpsharp{17} -\fetdef\rightparen{18} -\fetdef\leftparen{19} - -% dots -\fetdef\dot{20} -\fetdef\repeatcolon{21} - -% balls -\fetdef\brevisball{22} -\fetdef\brevisledger{23} -\fetdef\longaball{24} -\fetdef\longaledger{25} -\fetdef\wholeball{26} -\fetdef\wholeledger{27} -\fetdef\halfball{28} -\fetdef\halfledger{29} -\fetdef\quartball{30} -\fetdef\quartledger{31} - -% scripts -\fetdef\ufermata{32} -\fetdef\dfermata{33} -\fetdef\thumb{34} -\fetdef\sforzatoaccent{35} -\fetdef\staccato{36} -\fetdef\ustaccatissimo{37} -\fetdef\dstaccatissimo{38} -\fetdef\tenuto{39} -\fetdef\umarcato{40} -\fetdef\dmarcato{41} -\fetdef\ouvert{42} -\fetdef\plusstop{43} -\fetdef\upbow{44} -\fetdef\downbow{45} -\fetdef\reverseturn{46} -\fetdef\turn{47} -\fetdef\trill{48} -\fetdef\upedalheel{49} -\fetdef\dpedalheel{50} -\fetdef\upedaltoe{51} -\fetdef\dpedaltoe{52} -\fetdef\flageolet{53} -\fetdef\trilelement{54} -\fetdef\prall{55} -\fetdef\mordent{56} -\fetdef\prallprall{57} -\fetdef\prallmordent{58} -\fetdef\upprall{59} -\fetdef\downprall{60} -\fetdef\accDiscant{61} -\fetdef\accDiscantF{62} -\fetdef\accDiscantEh{63} -\fetdef\accDiscantE{64} -\fetdef\accDiscantFE{65} -\fetdef\accDiscantFEh{66} -\fetdef\accDiscantEE{67} -\fetdef\accDiscantFEE{68} -\fetdef\accDiscantEEE{69} -\fetdef\accDiscantFEEE{70} -\fetdef\accDiscantS{71} -\fetdef\accDiscantFS{72} -\fetdef\accDiscantES{73} -\fetdef\accDiscantEhS{74} -\fetdef\accDiscantFES{75} -\fetdef\accDiscantFEhS{76} -\fetdef\accDiscantEES{77} -\fetdef\accDiscantFEES{78} -\fetdef\accDiscantEEES{79} -\fetdef\accDiscantFEEES{80} -\fetdef\accDiscantSS{81} -\fetdef\accDiscantESS{82} -\fetdef\accDiscantEESS{83} -\fetdef\accDiscantEEESS{84} -\fetdef\accFreebass{85} -\fetdef\accFreebassF{86} -\fetdef\accFreebassE{87} -\fetdef\accFreebassFE{88} -\fetdef\accStdbass{89} -\fetdef\accStdbassM{90} -\fetdef\accStdbassBp{91} -\fetdef\accStdbassT{92} -\fetdef\accStdbassTp{93} -\fetdef\accBayanbass{94} -\fetdef\accBayanbassT{95} -\fetdef\accBayanbassE{96} -\fetdef\accBayanbassTE{97} -\fetdef\accBayanbassEE{98} -\fetdef\accBayanbassTEE{99} -\fetdef\accSB{100} -\fetdef\accBB{101} -\fetdef\accOldEE{102} -\fetdef\accOldEES{103} - -% flags -\fetdef\eighthflag{104} -\fetdef\sixteenthflag{105} -\fetdef\thirtysecondflag{106} -\fetdef\sixtyfourthflag{107} -\fetdef\deighthflag{108} -\fetdef\dsixteenthflag{109} -\fetdef\dthirtysecondflag{110} -\fetdef\dsixtyfourthflag{111} - -% clefs -\fetdef\altoclef{112} -\fetdef\caltoclef{113} -\fetdef\bassclef{114} -\fetdef\cbassclef{115} -\fetdef\trebleclef{116} -\fetdef\ctrebleclef{117} - -% timesig -\fetdef\fourfourmeter{118} -\fetdef\allabreve{119} -\fetdef\oldfourfourmeter{120} -\fetdef\oldallabreve{121} -\fetdef\oldthreetwometer{122} -\fetdef\oldsixfourmeter{123} -\fetdef\oldninefourmeter{124} - diff --git a/Documentation/programmer/fonts.doc b/Documentation/programmer/fonts.doc deleted file mode 100644 index 287dde49b1..0000000000 --- a/Documentation/programmer/fonts.doc +++ /dev/null @@ -1,330 +0,0 @@ - - % -*-LaTeX-*- - -\documentclass{article} -\def\kdots{,\ldots,} -\title{Not the Font-En-Tja font} -\author{HWN \& JCN} -\def\preMudelaExample{} -\def\postMudelaExample{} -\begin{document} -\maketitle - - -\section{Introduction} - -This document are some design notes of the Feta font, and other -symbols related to LilyPond. Feta (not an abbreviation of -Font-En-Tja) is a font of music symbols. All MetaFont sources are -original. The symbols are modelled after various editions of music, -notably \begin{itemize} \item B\"arenreiter \item Hofmeister \item -Breitkopf \item Durand \& C'ie \end{itemize} - -The best references on Music engraving are Wanske\cite{wanske} and -Ross\cite{ross} some of their insights were used. Although it is a -matter of taste, I'd say that B\"arenreiter has the finest typography -of all. - - -\section{Bezier curves for slurs} - -Objective: slurs in music are curved objects designating that notes -should fluently bound. They are drawn as smooth curves, with their -center thicker and the endings tapered. - -There are some variants: the simplest slur shape only has the width as -parameter. Then we give some suggestions for tuning the shapes. The -simple slur algorithm is used for drawing ties as well. - - - -\subsection{Simple slurs} - -Long slurs are flat, whereas short slurs look like small circle arcs. -Details are given in Wanske\cite{ross} and Ross\cite{wanske}. The -shape of a slur can be given as a Bezier curve with four control -points: - -\begin{eqnarray*} - B(t) &=& (1-t)^3c_1 +3(1-t)^2tc_2 + 3(1-t)t^2c_3 + t^3c_4. -\end{eqnarray*} - -We will assume that the slur connects two notes of the same -pitch. Different slurs can be created by rotating the derived shape. -We will also assume that the slur has a vertical axis of symmetry -through its center. The left point will be the origin. So we have -the following equations for the control points $c_1\kdots c_4$. - -\begin{eqnarray*} -c_1&=& (0,0)\\ -c_2&=& (i, h)\\ -c_3&=& (b-i, h)\\ -c_4&=& (b, 0) -\end{eqnarray*} - -The quantity $b$ is given, it is the width of the slur. The -conditions on the shape of the slur for small and large $b$ transform -to -\begin{eqnarray*} - h \to h_{\infty} , &&\quad b \to \infty\\ - h \approx r_{0} b, &&\quad b \to 0. -\end{eqnarray*} -To tackle this, we will assume that $h = F(b)$, for some kind of -$F(\cdot)$. One function that satisfies the above conditions is -$$ -F(b) = h_{\infty} \frac{2}{\pi} \arctan \left( \frac{\pi r_0}{2 -h_{\infty}} b \right). -$$ - -For satisfying results we choose $h_{\infty} = 2\cdot \texttt{interline}$ -and $r_0 = \frac 13$. - -\subsection{Height correction} - -Aside from being a smooth curve, slurs should avoid crossing -enclosed notes and their stems. - -An easy way to achieve this is to extend the slur's height, -so that the slur will curve just above any disturbing notes. - -The parameter $i$ determines the flatness of the curve. Satisfying -results have been obtained with $i = h$. - -The formula can be generalised to allow for corrections in the shape, -\begin{eqnarray*} -c_1&=& (0,0)\\ -c_2&=& (i', h')\\ -c_3&=& (b-i', h')\\ -c_4&=& (b, 0) -\end{eqnarray*} -Where -$$ -i' = h(b) (1 + i_{corr}), \quad h' = h(b) (1 + h_{corr}). -$$ - -The default values for these corrections are $0$. A $h_{corr}$ that is -negative, makes the curve flatter in the center. A $h_{corr}$ that is -positive make the curve higher. - -At every encompassed note's x position the difference $\delta _y$ -between the slur's height and the note is calculated. The greatest -$\delta _y$ is used to calculate $h_{corr}$ is by lineair extrapolation. - -However, this simple method produces satisfactory results only for -small and symmetric disturbances. - - -\subsection{Tangent method correction} - -A somewhat more elaborate\footnote{While staying in the realm -of empiric computer science} way of having a slur avoid -disturbing notes is by first defining the slur's ideal shape -and then using the height correction. The ideal shape of a -slur can be guessed by calculating the tangents of the disturbing -notes: -% a picture wouldn't hurt... -\begin{eqnarray*} - y_{disturb,l} &=& \rm{rc}_l x\\ - y_{disturb,r} &=& \rm{rc}_r + c_{3,x}, -\end{eqnarray*} -where -\begin{eqnarray*} - \rm{rc}_l &=& \frac{y_{disturb,l} - y_{encompass,1}} - {x_{disturb,l} - x_{encompass,1}}\dot x\\ - \rm{rc}_r &=& \frac{y_{encompass,n} - y_{disturb,r}} - {x_{encompass,n} - x_{disturb,r}} \dot x + c_{3,x}. -\end{eqnarray*} - -We assume that having the control points $c_2$ and $c_3$ located -on tangent$_1$ and tangent$_2$ resp. -% t: tangent -\begin{eqnarray*} - y_{tangent,l} &=& \alpha \rm{rc}_l x\\ - y_{tangent,r} &=& \alpha \rm{rc}_r + c_{3,x}. -\end{eqnarray*} - -Beautiful slurs have rather strong curvature at the extreme -control points. That's why we'll have $\alpha > 1$. -Satisfactory resulsts have been obtained with -$$ - \alpha \approx 2.4. -$$ - -The positions of control points $c_2$ and $c_3$ are obtained -by solving with the height-line -\begin{eqnarray*} - y_h &=& \rm{rc}_h + c_h. -\end{eqnarray*} - -The top-line runs through the points disturb$_{left}$ and -disturb$_{right}$. In the case that -$$ -z_{disturb,l} = z_{disturb,r}, -$$ -we'll have -$$ - \angle(y_{tangent,l},y_h) = \angle(y_{tangent,r},y_h). -$$ - - - -\section{Sizes} - -Traditional engraving uses a set of 9 standardised sizes for Staffs -(running from 0 to 8). - -We have tried to measure these (helped by a magnifying glass), and -found the staffsizes in table~\ref{fonts:staff-size}. One should note that -these are estimates, so I think there could be a measuring error of ~ -.5 pt. Moreover [Ross] states that not all engravers use exactly -those sizes. - -\begin{table}[h] - \begin{center} - \begin{tabular}{lll} -Staffsize &Numbers &Name\\ -\hline\\ -26.2pt &No. 0\\ -22.6pt &No. 1 &Giant/English\\ -21.3pt &No. 2 &Giant/English\\ -19.9pt &No. 3 &Regular, Ordinary, Common\\ -19.1pt &No. 4 &Peter\\ -17.1pt &No. 5 &Large middle\\ -15.9pt &No. 6 &Small middle\\ -13.7pt &No. 7 &Cadenza\\ -11.1pt &No. 8 &Pearl\\ - \end{tabular} - \caption{Foo} - \label{fonts:staff-size} - \end{center} -\end{table} - - - - -\section{Beams} - -\subsection{Slope} - -Traditionally, beam slopes are computed by following a large and hairy -set of rules. Some of these are talked-about in Wanske, a more -recipy-like description can be found in Ross. - -There are some problems when trying to follow these rules: -\begin{itemize} - -\item the set is not complete - -\item they are not formulated as a general rule with exceptions, but -rather as a huge case of individual rules\cite{ross} - -\item in some cases, the result is wrong or ugly (or both) - -\item they try to solve a couple of problems at a time (e.g. Ross -handles ideal slope and slope-quantisation as a paired problem) -\end{itemize} -Reading Ross it is clear that the rules presented there are certainly -not the ultimate idea of what beam(slope)s should look like, but -rather a (very much) simplified hands-on recipy for a human engraver. - -There are good reasons not to follow those rules: - -\begin{itemize} -\item One cannot expect a human engraver to solve least-squares -problems for every beam - -\item A human engravers will allways trust themselves in judging the -outcome of the applied recipy. If, in a complicated case, the result -"doesn't look good", they will ignore the rules and draw their own -beams, based on experience. - -\item The exact rules probably don't "really exist" but in the minds - of good engravers, in the form of experience -\end{itemize} - -We'll propose to do a least-squares solve. This seems to be the best -way to calculate the slope for a computerised engraver such as Lily. - -It would be nice to have some rules to catch and handle "ugly" cases, -though. In general, the slope of the beam should mirror the pitches -of the notes. If this can't be done because there simply is no -uniform trend, it would probably be best to set the slope to zero. - - -\subsection{Quantising} - -The beams should be prevented to conflict with the stafflines, -especially at small slopes. Traditionally, poor printing techniques -imposed rather strict rules for quantisation. In modern (post 1955) -music printing we see that quality has improved substantially and -obsoleted the technical justification for following some of these -strict rules, notably the avoiding of so-called wedges. - - -\subsection{Thickness and spacing} - -The spacing of double and triple beams (sixteenth and thirtysecond beams) -is the same, quadruple and quintuple (thirtyfourth and hundredtwentyeighth -beams) is wider. -All beams are equally thick. Using the layout of triple beams and the -beam-thickness $bt$ we can calculate the inter-beam spacing $ib$. - -Three beams span two interlines, including stafflines: -\begin{eqnarray*} - 2 ib + bt &=& 2 il\\ - ib &=& (2 il - bt) / 2 -\end{eqnarray*} - -We choose -\begin{eqnarray*} - bt &=& 0.48(il - st) -\end{eqnarray*} - -\subsubsection{Quadruple beams} - -If we have more than three beams they must open-up -in order to not collide with staff lines. The only valid -position that remains is for the upper beam to hang. - -\begin{eqnarray*} - 3 ib_{4+} + bt &=& 3 il\\ - ib_{4+} &=& (3 il - bt) / 3 -\end{eqnarray*} - - -\section{Layout of the source files} - -The main font (with the fixed size music glyphs) uses a the \TeX\ -logfile as a communication device. Use the specialised macros to -create and export glyphs. - -\bibliographystyle{plain} -\bibliography{engraving} - - - -\end{document} - -\begin{verbatim} -Paul Terry writes: - -Ross states that the dies (the stamps to make the symbols) come in -12 different sizes. - ->Can you tell me how big rastrals are? - -According to the Score manual: - - Rastral Size Height in millimetres - - 0 9 mm - 1 8 mm - 2 7.5 mm - 3 7 mm - 4 6.5 mm - 5 6 mm - 6 5.5 mm - -I must say, despite having been a music setter for many years, I had to -look these up - none of the publishers I work for deal in Rastral sizes -these days (they all use millimetres). diff --git a/Documentation/programmer/lilypond-overview.doc b/Documentation/programmer/lilypond-overview.doc deleted file mode 100644 index a408a9e8eb..0000000000 --- a/Documentation/programmer/lilypond-overview.doc +++ /dev/null @@ -1,743 +0,0 @@ -%-*-LaTeX-*- - -\documentclass{article} -\usepackage{a4} -\def\postMudelaExample{\setlength{\parindent}{1em}} -\title{LilyPond, a Music Typesetter} -\author{HWN} -\usepackage{musicnotes} -\usepackage{graphics} - - -\begin{document} -\maketitle - -[THIS IS WORK IN PROGRESS. THIS IS NOT FINISHED] - -% -*-LaTeX-*- -\section{Introduction} - -The Internet has become a popular medium for collaborative work on -information. Its success is partly due to its use of simple, text-based -formats. Examples of these formats are HTML and \LaTeX. Anyone can -produce or modify such files using nothing but a text editor, they are -easily processed with run-of-the-mill text tools, and they can be -integrated into other text-based formats. - -Software for processing this information and presenting these formats -in an elegant form is available freely (Netscape, \LaTeX, etc.). -Ubiquitousness of the software and simplicity of the formats have -revolutionised the way people publish text-based information -nowadays. - -In the field of performed music, where the presentation takes the form -of sheet music, such a revolution has not started yet. Let us review -some alternatives that have been available for transmitting sheet -music until now: -\begin{itemize} -\item MIDI\cite{midi}. This format was designed for interchanging performances - of music; one should think of it as a glorified tape recorder - format. It needs dedicated editors, since it is binary. It does - not provide enough information for producing musical scores: some of - the abstract musical content of what is performed is thrown away. - -\item PostScript\cite{Postscript}. This format is a printer control - language. Printed musical scores can be transmitted in PostScript, - but once a score is converted to PostScript, it is virtually - impossible to modify the score in a meaningful way. - -\item Formats for various notation programs. Notation programs either - work with binary formats (e.g., NIFF\cite{niff-web}), need specific - platforms (e.g., Sibelius\cite{sibelius}), are proprietary or - non-portable tools themselves (idem), produce inadequate output - (e.g., MUP\cite{mup}), are based on graphical content (e.g., - MusixTeX\cite{musixtex1}), limit themselves to specific subdomains - (e.g., ABC\cite{abc2mtex}), or require considerable skill and - knowledge to use (e.g., SCORE\cite{score}) - -\item SMDL\cite{smdl-web}. This is a very rich ASCII format, that is - designed for storing many types of music. Unfortunately, there is - no implementation of a program to print music from SMDL available. - Moreover, SMDL is so verbose, that it is not suitable for human - production. - -\item TAB\cite{tablature-web}. Tab (short for tablature) is a popular - format, for interchanging music over e-mail, but it can only be used - for guitar music. -\end{itemize} - -In summary, sheet music is not published and edited on a wide scale -across the internet because no format for music -interchange exists that is: -\begin{itemize} -\item open, i.e., with publically available specifications. -\item based on ASCII, and therefore suitable for human consumption and - production. -\item rich enough for producing publication quality sheet music from - it. -\item based on musical content (unlike, for example, PostScript), and - therefore suitable for making modifications. -\item accompanied by tools for processing it that are freely available - across multiple platforms. -\end{itemize} - - -With the creation of LilyPond, we have tried to create both a -convenient format for storing sheet music, and a portable, -high-quality implementation of a compiler, that compiles the input -into a printable score. You can find a small example of LilyPond -input along with output in Figure~\ref{fig:intro-fig}. -% -\begin{figure}[htbp] - \begin{center} -\begin[verbatim]{mudela} - \score { - \notes - \context GrandStaff < - \transpose c'' { c4 c4 g4 g4 a4 a4 g2 } - { \clef "bass"; c4 c'4 - \context Staff f'4 c'4 e'4 c'4 } - > - \paper { - linewidth = -1.0\cm ; - } - } -\end{mudela} - \caption{A small example of LilyPond input} - \label{fig:intro-fig} - \end{center} -\end{figure} -% - - -The input language encodes musical events (such as notes and rests) on -the basis of their time-ordering. For example, the grammar includes -constructs that specify that notes start simultaneous and that notes -are to be played in sequence. In this encoding some context that is -present in sheet music is lost. - -The compiler reconstructs the notation from the encoded music. Its -operation comprises four different steps (see -Figure~\ref{fig:intro-steps}). - -\begin{description} -\item[Parsing] During parsing, the input is converted in a syntax tree. - -\item[Interpreting] In the \emph{interpreting} step, it is determined - which symbols have to be printed. Objects that correspond to - notation (\emph{Graphical objects}) are created from the syntax tree - in this phase. Generally speaking, for every symbol printed there is - one graphical object. These objects are incomplete: their position - and their final shape is unknown. - - The context that was lost by encoding the input in a language is - reconstructed during this conversion. -\item[Formatting] The next step is determing where symbols are to be - placed, this is called \emph{formatting}. -\item[Outputting] - Finally, all Graphical objects are outputted as PostScript or \TeX\ code. -\end{description} - -\def\staffsym{\vbox to 16pt{ - \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip - \vfil - \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip - \vfil - \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip - \vfil - \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip - \vfil - \hbox{\vrule width 1cm depth .2pt height .2pt}\nointerlineskip -}} - -\def\vspacer{\vbox to 20pt{\vss}} -\begin{figure}[h] -\def\spacedhbox#1{\hbox{\ #1\ }} -\begin{eqnarray*} - {\spacedhbox{Input}\atop \hbox{\texttt{\{c8 c8\}}}} {\spacedhbox{Parsing}\atop\longrightarrow} - {\spacedhbox{Syntax tree}\atop\spacedhbox{\textsf{Sequential(Note,Note)}}} - {\spacedhbox{Interpreting}\atop\longrightarrow}\\ - \vspacer\\ - {\spacedhbox{Graphic objects}\atop\spacedhbox{\texttrebleclef \textquarterhead\texteighthflag\textquarterhead\texteighthflag \staffsym }} - {\spacedhbox{Formatting}\atop\longrightarrow} - {\spacedhbox{Formatted objects}\atop\hbox{ - \mudela{c''8 c''8} - }}\\ -\vspacer\\ - {\spacedhbox{Outputting}\atop\longrightarrow} - {\spacedhbox{PostScript code}\atop\hbox{\texttt{\%!PS-Adobe}\ldots}} -\end{eqnarray*} - \caption{Parsing, Interpreting, Formatting and Outputting} - \label{fig:intro-steps} -\end{figure} - - -The second step, the interpretation phase of the compiler, can be -manipulated as a separate entity: the interpretation process is -composed of many separate modules, and the behaviour of the modules is -parameterised. By recombining these interpretation modules, -and changing parameter settings, the same piece of music can be -printed differently, as is shown in Figure~\ref{fig:intro-interpret}. - -This makes it easy to extend the program. Moreover, this enables the -same music to be printed in different versions, e.g., in a conductors -score and in extracted parts. - - -\begin{figure}[h] - \begin{center} - \begin{mudela} - \score { - \notes - \context GrandStaff < - \transpose c'' { c4 c4 g4 g4 a4 a4 g2 } - { \clef "bass"; c4 c'4 - \context Staff f'4 c'4 e'4 c'4 } - > - \paper { - linewidth = -1.0\cm ; - \translator { - \VoiceContext - \remove "Stem_engraver"; - } - \translator { - \StaffContext - numberOfStaffLines = 3; - } - } - } - \end{mudela} - \caption{The interpretation phase can be manipulated: the same - music as in Figure~\ref{fig:intro-fig} is interpreted - differently: three staff lines and no stems.} - \label{fig:intro-interpret} - \end{center} -\end{figure} - - - -\section{Preliminaries} - -To understand the rest of the article, it is necessary to know -something about music notation and music typography. Since both -communicate music, we will explain some characteristics of instruments -and western music that motivate some notational constructs. - -\subsection{Music} - -Music notation is meant to be read by human performers. They sing or -play instruments that can produce sounds of different pitches. These -sounds are called \emph{notes}. Additionally, the sounds can be -articulated in differents ways, e.g., staccato (short and separated) -or legato (fluently bound together). The loudness of the notes can -also be varied. Changes in loudness are called \emph{dynamics}. - -Silence is also an element of music. The musical terminology for -silence within music is \emph{rest}. - -The basic unit of pitch is the \emph{octave}. The octave corresponds -to a frequency ratio of 1:2. For example the pitch denoted by a' -(frequency: 440 hertz) is one octave lower than a'' (frequency: 880 -hertz). Various instruments have a limited \emph{pitch range}, for -example, a trumpet has a range of about 2.5 octaves. Not all -instruments have ranges in the same register: a tuba also has a range -of 2.5 octaves, but the range of the tuba is much lower. - -Musicology has a confusing mix of relative and absolute measures for -pitches: the term `octave' refers to both a difference between two -pitches (the frequency ratio of 1:2), and to a range of pitches. For -example, the term `[eengestreept] octave' refers to the pitch range -between 261.6 Hz and 523.3 Hz. - - -The octave is divided into smaller pitch steps. In modern western -music, every octave is divided into twelve approximately equidistant -pitch steps, and each step is called a \emph{semitone}. Usually, the -pitches in a musical piece come from a smaller subset of these twelve -possible pitches. This smaller subset along with the musical -functions fo the pitches is called the -\emph{tonality}\footnote{Tonality also refers to the relations between - and functions of certain pitches. Since these do not have any - impact on notation, we ignore this} of the piece. - - -The standard tonality that forms the basis of music notation -(the key of C major) is a set of seven pitches within every octave. -Each of these seven is denoted by a name. In English, these are names -are (in rising pitch) denoted by c, d, e, f, g, a and b. Pitches that -are a semitone higher or lower than one of these seven can be -represented by suffixing the name with `sharp' or `flat' -respectively (this is called an \emph{chromatic alteration}). - -A pitch therefore can be fully specified by a combination of the -octave number, the note name and a chromatic alteration. -Figure~\ref{fig:intro-pitches} shows the relation between names and -frequencies. - - - - -\begin{figure}[h] - \begin{center} - [te doen] - \end{center} - \caption{Pitches in western music. The octave number is denoted - by a superscript.} - \label{fig:intro-pitches} -\end{figure} - - -Many instruments can produce more than one note at the same time, e.g. -pianos and guitars. When more notes are played simultaneously, they -form a so-called \emph{chord}. - -The unit of duration is the \emph{beat}. When playing, the tempo is -determined by setting the number of beats per minute. In western -music, beats are often stressed in a regular pattern: for example -Waltzes have a stress pattern that is strong-weak-weak, i.e. every -note that starts on a `strong' beat is louder and has more pronounced -articulation. This stress pattern is called \emph{meter}. - -\subsection{Music notation} - -Music notation is a system that tries to represent musical ideas -through printed symbols. Music notation has no precise definition, -but most conventions have described in reference manuals on music -notation\cite{read-notation}. - -In music notation, sounds and silences are represented by symbols that -are called note and rest respectively.\footnote{These names serve a - double purpose: the same terms are used to denote the musical - concepts.} The shape of notes and rests indicates their duration -(See figure~\ref{noteshapes}) relative to the whole note. - - -\begin{figure}[h] - \begin{center} -\begin{mudela} - \score { - \notes \transpose c''{ c\longa*1/4 c\breve*1/2 c1 c2 c4 c8 c16 c32 c64 } - \paper { - \translator { - \StaffContext - \remove "Staff_symbol_engraver"; - \remove "Time_signature_engraver"; -% \remove "Bar_engraver"; - \remove "Clef_engraver"; - } -linewidth = -1.; - } -} -\end{mudela} -\begin{mudela} - \score { - \notes \transpose c''\context Staff { r\longa*1/4 r\breve*1/2 r1 r2 r4 r8 r16 r32 r64 } - \paper { - \translator { - \StaffContext - \remove "Staff_symbol_engraver"; - \remove "Time_signature_engraver"; -% \remove "Bar_engraver"; - \remove "Clef_engraver"; - } - linewidth = -1.; - } -} -\end{mudela} - \caption{Note and rest shapes encode the length. At the top notes - are shown, at the bottom rests. From left to right a quadruple - note (\emph{longa}), double (\emph{breve}), whole, half, - quarter, eigth, sixteenth, thirtysecond and sixtyfourth. Each - note has half of the duration of its predecessor.} - \label{fig:noteshapes} -\end{center} -\end{figure} - - -Notes are printed in a grid of horizontal lines called \emph{staff} to -denote their pitch: each line represents the pitch of from the -standard scale (c, d, e, f, g, a, b). The reference point is the -\emph{clef}, eg., the treble clef marks the location of the $g^1$ -pitch. The notes are printed in their time order, from left to right. - - -\begin{figure}[h] - \begin{center} - \begin{mudela} - \score { \notes { - a4 b c d e f g a \clef bass; - a4 b c d e f g a \clef alto; - a4 b c d e f g a \clef treble; - } - \paper { linewidth = 15.\cm; } - } - \end{mudela} - \caption{Pitches ranging from $a, b, c',\ldots a'$, in different - clefs. From left right the bass, alto and treble clef are - featured.} - \label{fig:pitches} - \end{center} -\end{figure} - -The chromatic alterations are indicated by printing a flat sign or a -sharp sign in front of the note head. If these chromatic alterations -occur systematically (if they are part of the tonality of the piece), -then this indicated with a \emph{key signature}. This is a list of -sharp/flat signs which is printed next to the clef. - -Articulation is notated by marking the note shapes wedges, hats and -dots all indicate specific articulations. If the notes are to be -bound fluently (legato), the note shapes are encompassed by a smooth -curve called \emph{slur}, - -\begin{figure}[h] - \begin{center} - \begin{mudela} - c'4-> c'4-. g'4 ( b'4 ) g''4 - \end{mudela} - \caption{Some articulations. From left to right: extra stress - (\emph{marcato}), short (staccato), slurred notes (legato).} - \label{fig:articulation} - \end{center} -\end{figure} - - - -Dynamics are notated in two ways: absolute dynamics are indicated by -letters: \textbf{f} (from Italian ``forte'') stands for loud, -\textbf{p} (from Italian ``piano'') means soft. Gradual changes in -loudness are notated by (de)crescendos. These are hairpin like shapes -below the staff. - -\begin{figure}[h] - \begin{center} - \begin{mudela} - g'4\pp \< g'4 \! g'4 \ff \> g'4 g' \! g'\ppp - \end{mudela} - \caption{Dynamics: start very soft (pp), grow to loud (ff) and - decrease to extremely soft (ppp)} - \label{fig:dynamics} - \end{center} -\end{figure} - - -The meter is indicated by barlines: every start of the stress pattern -is preceded by a vertical line, the \emph{bar line}. The space -between two bar lines is called measure. It is therefore the unit of -the rhythmic pattern. - -The time signature also indicates what kind of rhythmic pattern is -desired. The time signature takes the form of two numbers stacked -vertically. The top number is the number of beats in one measure, the -bottom number is the duration (relative to the whole note) of the note -that takes one beat. Example: 2/4 time signature means ``two beats -per measure, and a quarter note takes one beat'' - -Chords are written by attaching multiple note heads to one stem. When -the composer wants to emphasize the horizontal relationships between -notes, the simultaneous notes can be written as voices (where every -note head has its own stem). A small example is given in -Figure~\ref{fig:simultaneous}. - -\begin{figure}[h] - \begin{center} - \begin{mudela} - \relative c'' {\time 2/4; - \context Staff < \context Voice = VA{ - \stemdown - c4 d - b16 b b b b b b b } - \context Voice = VB { - \stemup e4 f g8 g4 g8 } > - } - \end{mudela} - \caption{Notes sounding together. Chord notation (left, before - the bar line) emphasizes vertical relations, voice notation - emphasizes horizontal relations. Separate voices needn't have - synchronous rhythms (third measure). - } - \label{fig:simultaneous} - \end{center} -\end{figure} - -Separate voices do not have to share one rhythmic pattern---this is -also demonstrated in Figure~\ref{fig:simultaneous}--- they are in a sense%vaag -independent. A different way to express this in notation, is by -printing each voice on a different staff. This is customary when -writing for piano (both left and right hand have a staff of their own) -and for ensemble (every instrument has a staff of its own). - - - -\subsection{Music typography} - -Music typography is the art of placing symbols in esthetically -pleasing configuration. Little is explicitly known about music -typography. There are only a few reference works -available\cite{ross,wanske}. Most of the knowledge of this art has -been transmitted verbally, and was subsequently lost. - -The motivation behind choices in typography is to represent the idea -as clearly as possible. Among others, this results in the following -guidelines: -\begin{itemize} -\item The printed score should use visual hints to accentuate the - musical content -\item The printed score should not contain distracting elements, such - as large empty regions or blotted regions. -\end{itemize} - -An example of the first guideline in action is the horizontal spacing. -The amount of space following a note should reflect the duration of -that note: short notes get a small amount of space, long notes larger -amounts. Such spacing constraints can be subtle, for the -``amount of space'' is only the impression that should be conveyed; there -has to be some correction for optical illusions. See -Figure~\ref{fig:spacing}. - -\begin{figure}[h] - \begin{center} - \begin{mudela} - \relative c'' { \time 3/4; c16 c c c c8 c8 | f4 f, f' } - \end{mudela} - \caption{Spacing conveys information about duration. Sixteenth - notes at the left get less space than quarter notes in the - middle. Spacing is ``visual'', there should be more space - after the first note of the last measure, and less after second. } - \label{fig:spacing} - \end{center} -\end{figure} - -Another example of music typography is clearly visible in collisions. -When chords or separate voices are printed, the notes that start at -the same time should be printed aligned (ie., with the same $x$ -position). If the pitches are close to each other, the note heads -would collide. To prevent this, some notes (or note heads) have to be -shifted horizontally. An example of this is given in -Figure~\ref{fig:collision}. -\begin{figure}[h] - \begin{center} - [todo] - \caption{Collisions} - \label{fig:collision} - \end{center} -\end{figure} - -\bibliographystyle{hw-plain} -\bibliography{engraving,boeken,colorado,computer-notation,other-packages} - -\section{Requirements} - - -\section{Approach} - -\subsection{Input} - -The input format consists of combining a symbolic representation of -music with style sheet that describes how the symbolic presentation -can converted to notation. The symbolic representation is based on a -context free language called \textsf{music}. Music is a recursively -defined construction in the input language. It can be constructed by -combining lists of \textsf{music} sequentially or parallel or from -terminals like notes or lyrics. - -The grammar for \textsf{music} is listed below. It has been edited to -leave out the syntactic and ergonomic details. - -\begin{center} - \begin{tabular}{ll} -Music: & SimpleMusic\\ - & $|$ REPEATED int Music ALTERNATIVE MusicList\\ - & $|$ SIMULTANEOUS MusicList\\ - & $|$ SEQUENTIAL MusicList\\ - & $|$ CONTEXT STRING '=' STRING Music\\ - & $|$ TIMES int int Music \\ - & $|$ TRANSPOSE PITCH Music \\ -SimpleMusic: & $|$ Note\\ - & $|$ Lyric\\ - & $|$ Rest\\ - & $|$ Chord\\ - & $|$ Command\\ -Command: & METERCHANGE\\ - & $|$ CLEFCHANGE\\ - &$|$ PROPERTY STRING '=' STRING\\ -Chord: &PitchList DURATION\\ -Rest: &REST DURATION\\ -Lyric: &STRING DURATION\\ -Note: &PITCH DURATION\\ -\end{tabular} -\end{center} - -The terminals are both purely musical concepts that have a duration, -and take a non-zero amount of musical time, like notes and lyrics, and -commands that behave as if they have no duration.\footnote{The - PROPERTY command is a generic mechanism for controlling the - interpretation, i.e. the musical style sheets. See [forward ref]} - -The nonterminal productions can -\begin{itemize} -\item Some productions combine multiple elements: one can specify that - element are to be played in sequence, simultaneously or repetitively. -\item There are productions for transposing music, and for dilating - durations of music: the TIMES production can be used to encode a - triplet.\footnote{A triplet is a group of three notes marked by a - bracket, that are played 3/2 times faster.} -\item - There are productions that give directions to the interpretation - engine (the CONTEXT production) -\end{itemize} - - -\section{Context in notation} - -Music notation relies heavily on context. Notational symbols do not -have meaning if they are not surrounded by other context elements. In -this section we give some examples how the reader uses this context do -derive meaning of a piece of notation. We will focus on the prime -example of context: the staff. - -A staff is the grid of five horizontal lines, but it contains more components : -\begin{itemize} -\item A staff can have a key signature (printed at the left) -\item A staff can have a time signature (printed at the left) -\item A staff has bar lines -\item A staff has a clef (printed at the left) -\end{itemize} - -It is still possible to print notes without these components, but one -cannot determine the meaning of the notes. -\begin{mudela} -\score{ -\notes \relative c' { \time 2/4; g'4 c,4 a'4 f4 e c d2 } -\paper { - linewidth = -1.; - \translator { - \StaffContext - \remove "Time_signature_engraver"; -% \remove "Bar_engraver"; - \remove "Staff_symbol_engraver"; - \remove "Clef_engraver"; - \remove "Key_engraver"; - } - } -} -\end{mudela} - -As you can see, you can still make out the general form of the melody -and the rhythm that is to be played, but the notation is difficult to -read and the musical information is not complete. The stress -pattern in the notes can't be deduced from this output. For this, we -need a time signature. Adding barlines helps with finding the strong -and weak beats. -\begin{mudela} -\score { - \notes \relative c' { \time 2/4; g'4 c,4 a'4 f4 e c d2 } - \paper{ - linewidth = -1.; -\translator{ - \StaffContext - \remove "Staff_symbol_engraver"; - \remove "Clef_engraver"; - \remove "Key_engraver";} - } - } -\end{mudela} - -It is impossible to deduce the exact pitch of the notes. One needs a -clef to do so. Staff lines help the eye in determining the vertical -position of a note wrt. to the clef. -\begin{mudela} -\score { - \notes \relative c' {\clef alto; \time 2/4; g'4 c,4 a'4 f4 e c d2 } - \paper { - linewidth = -1.; - } -} -\end{mudela} - -Now you know the pitch of the notes: you look at the start of the line -and see a clef, and with this clef, you can determine the notated pitches. -You have found the em(context) in which the notation is to be -interpreted! - - -\section{Interpretation context} - -Context (clef, time signature etc.) determines the relationship -between musical and its notation in notes. Because LilyPond writes -notation, context works the other way around for LilyPond: with -context a piece of music can be converted to notation. - -A reader remembers this context while reading the notation from left -to right. By analogy, LilyPond constructs this context while -constructing notes from left to right. This is what happens in the -``Interpretation'' phase from~\ref{fig:intro-fig}. In LilyPond, the -state of this context is a set of variables with their values; A staff -context contains variables like - -\begin{itemize} -\item current clef -\item current time signature -\item current key -\end{itemize} - -These variables determine when and how clefs, time signatures, bar -lines and accidentals are printed. - - -Staff is not the only form of context in notation. In polyphonic -music, the stem direction shows which notes form a voice: all notes of -the same voice have stems pointing in the same direction. The value -of this variable determines the appearance of the printed stems. - -In LilyPond ``Notation context'' is abstracted to a data structure -that is used, constructed and modified during the interpretation -phase. It contains context properties, and is responsible for -creating notational elements: the staff context creates symbols for -clefs, time signatures and key signatures. The Voice context creates -stems, note heads. - -For the fragment of polyphonic music below, -\begin{mudela} - \context Staff { c'4 < { \stemup c'4 } \context Voice = VB { \stemdown a4 } > } -\end{mudela} -A staff context is created. Within this staff context (which printed -the clef), a Voice context is created, which prints the first note. -Then, a second Voice context is created, with stem direction set to -``up'', and the direction for the other is set to down. Both Voice -contexts are still part of the same Staff context. - -In the same way, multiple staff scores are created: within the score -context, multiple staff contexts are created. Every staff context -creates the notation associated with a staff. - -\section{Discussion} - - - -\end{document} - -The complexity of music notation was tackled by adopting a modular -design: both the formatting system (which encodes the esthetic rules of -notation), and the interpretation system (which encodes the semantic -rules) are highly modular. - - -The difficulty in creating a format for music notation is rooted in -the fact that music is multi dimensional: each sound has its own -duration, pitch, loudness and articulation. Additionally, multiple -sounds may be played simultaneously. Because of this, there is no -obvious way to ``flatten'' music into a context-free language. - -The difficulty in creating a printing engine is rooted in the fact -that music notation complicated: it is very large graphical -``language'' with many arbitrary esthetic and semantic conventions. -Building a system that formats full fledged musical notation is a -challenge in itself, regardless of whether it is part of a compiler or -an editor. - -The fact that music and its notation are of a different nature, -implies that the conversion between input notation is non-trivial. - -In LilyPond we solved the above problem in the following way: - diff --git a/Documentation/programmer/musicnotes.sty b/Documentation/programmer/musicnotes.sty deleted file mode 100644 index 31d2f83a9c..0000000000 --- a/Documentation/programmer/musicnotes.sty +++ /dev/null @@ -1,43 +0,0 @@ - -\input lilyponddefs - -\def\fetdef#1#2{% - \def#1{\hbox{\char#2}}} - -% huh? from where -\input feta20.sty - -\font\fetasixteenfont=feta16 -\font\fetaelevenfont=feta11 -\def\fetafont{\fetasixteenfont} - -\newdimen\ild -\ild=4pt -\newdimen\stemthick -\stemthick=0.4pt - -\def\eighthstem{{\fetafont\vrule height 3.5ex width \stemthick depth0pt\raise - 3.5ex\hbox{\eighthflag}}} -\def\texteighthflag{{\fetafont\raise 0ex\hbox{\fetafont\eighthflag}}} -\def\textdeighthflag{{\fetafont\raise 0ex\hbox{\deighthflag}}} - -\def\texteighthnote{{\hbox{\hbox{\fetafont\quartball}\kern - -0.5\stemthick\eighthstem}}} -\def\quarterstem{{\fetafont\vrule height 3.5ex width \stemthick depth0pt}} -\def\textquarterstem{\quarterstem} -\def\textchord{{\hbox{\fetafont\lower.5ex\hbox to - 0pt{\textquarterhead}\raise.5ex\hbox{\textquarterhead}\kern - -0.5\stemthick\eighthstem}}} -\def\textbassclef{\hbox{\fetafont\bassclef}} -\def\texttrebleclef{\hbox{\fetafont\trebleclef}} -\def\textslur{\embeddedps{9.378744 -3.171539 3.923099 -3.171539 0.000000 0.000000 12.800000 0.000000 3.672177 -3.672177 9.127823 -3.672177 12.800000 0.000000 0.000000 0.000000 draw_slur}} - -\def\textmarcato{{\fetafont\raise 1ex\hbox{\hskip 1ex\sforzatoaccent}}} - - -\def\textquarterhead{\hbox{\fetafont\raise 2.5pt\hbox{\quartball}}} -\def\texteighthstem{\hbox{\lower 5pt\hbox{\eighthstem}}} -\def\texthalfnote{{\hbox{\hbox{\fetafont\halfball}\kern -0.5\stemthick\quarterstem}}} -\def\textquarternote{{\hbox{\hbox{\fetafont\quartball}\kern -0.5\stemthick\quarterstem}}} -\def\textflat{{\fetafont\raise 1ex\hbox{\flat}}} -\def\textsharp{{\fetafont\raise1ex\hbox{\sharp}}} diff --git a/TODO b/TODO index 94b4f38ce5..ee47eb587a 100644 --- a/TODO +++ b/TODO @@ -1,580 +1,2 @@ --*-outline-layout:(2 (-1 -1 0 :) 0);outline-stylish-prefixes:nil -*- - -* GNU LilyPond TODO -Features you cannot find in the documentation as working, should be -mentioned here. This is an assorted collection of stuff that will be -done, might be done, or is an idea that we want to think about. -Most of the items are marked in the code as well -Grep -i for TODO, FIXME and ugh/ugr/urg. - -.* TODO -. * use hash tabs iso. alist_ for elt property? -. * unhardcode stuff in bezier-bow: all sizes other than 20pt are - broken -. * use ports iso. iostream. -. * hard constraints for broken slurs to. -. * Staff_margin_engraver placement is broken for Staff.instr(ument) -. * Bracket/brace placement and stacking is broken -. * Lattermann: - - 2. There dynamic markings of the cello part are set in roman (maybe - because of pizz. and arco in roman?) - - 4. Bar 41/42, violins: the ties should be the same direction, pref. - down in bar 42. - -- dir of broken ties - - 7. This is a bug: there's a colon in the middle of the two harmonium - staves - - 12. bars 82 to 84 and 88: the ties of upper harmonium should all bend down. - -- stemdown ~ stemup and at linebreak - - 15. bar 89, harmonium, the ties coming from the previous line look strangely - asymmetric. - - -. * Mondrup: - -- In some cases I don't get the large textsize within note examples I request. -Consider for example the entry 'c clef', where \property Lyrics.textStyle = "large" -used to give that result. It doesn't now. The large text sizes DO work in other cases, -for example in the entry 'chord' (\property Voice.textStyle = "large"). To me it looks -like the property Voice.textStyle is working while Lyrics.textStyle isn't. Consider -for example the entry 'functional harmony' which has the same problem as 'chord' - -- I don't get full size clef changes upon issuing \property Voice.clefStyle = -"fullSizeChanges", see for example the entry 'c clef'. - -- In the entry 'brace' the second note example using \context StaffGroup gets the -staff bracket offset to the left page margin !! while the first note example behaves -normally. - --

in mudela-book -. * mats - -If textStyle is set (in the \paper section), this setting -applies also to dynamics. - -Also, the marginScriptPadding should be set by default to give -a nice layout, but that's already been reported on the list. - -- What happened to the StaffGroup brackets? - Try input/test/orchestscore.ly which worked fine in pl 27. - -- Why do I get bar numbers on every bar (both for the score - and the parts)? - -- Bar numbers and marks are not printed on top of the staffs, - but at one of the middle parts of the score. This may be - related to the problem with the brackets, since the - corresponding StaffGroup is the only one to get a bracket, - even though it is misplaced horisontally. - -- The score extends too high on the page, it often overwrites the - page number. LaTeX warns about overfull boxes. I'll take a look - at the page layout. - -. * control paper-size/-file from commandline ? - lilypond --paper=paper16 foo.ly - lilypond --paper=paper20 foo.ly - lilypond --paper=paper-as9 foo.ly -. * detangle ly/* paper-params papersize stuff -. * fix tremolos. -. * change ) c4 to c4-) -. * automated marks. -. * There should be no pagebreak below the title of the movement!! -. * tempo: - -> - Tempo Indications: -> * \tempo 4 = 60 should be printed -> * There should be commands like \alloegro that also do something -> sensible in midi. -> -. * - It should be possible to have Bar numbers on every bar. - -. * dynamics: -> * Notes should be spaced out for crescendos (had to use c^" ") -> * something like c-.->\ff looks ugly. The dynamc indication should -> appear left of the marks -> -. * -There's insufficient leading between lines of lyrics, so risers like -`l' and 'b' collide with the bottom of the line above. - -Also the lines are unevenly spaced. - -. * write comments in the source code -. * internationalize GUILE msgs. -. * roy rankin: -1> The volta brackets are on top of the lyrics. This problem existed in - 1.2.x which I corrected by giving the brackets a vertical size. I - have not had the time to check what is going on in 1.3. - -2> Part names are being written on top of the staff and not in the - left margin. - -3> The tag at the end is spaced out clear across the page. (new problem - in 1.3.27) - -I also get the following error messages from ly2dvi. -. * unbroken marks. -. * chubb: --- Take a piece of early music, and typeset it as closely as possible to -the original edition. This means: moveable clefs, sometimes funny or no -time signatures, few or no bar lines, few or no ties, slurs or -phrasemarks, ornaments implied by the structure of the music, or -indicated by, e.g., one or more thick lines through the stem of a note -(Purcell and Farnaby both use this extensively, but with rather -different meanings). For Dowland's music it may also mean being able -to rotate one or more staves (but I can do this in LaTeX). - --- Add to this music a set of critical marks that: - * regularises clef, time and key signature. - * add slurs, phrase marks, articulation, etc. - * Halve or quarter the durations, so that minims become crotchets, say. - * add ornaments (mordents, trills, turns etc) - * add regular barlines (which sometimes will mean splitting a note - and adding a tie, e.g., in some of Byrd's music) - * Add footnotes to particular symbols, groups of notes, etc. - * When translating from chant notation, add a square bracket over a - group of notes to indicate a ligature in the original -etc. - * Discretionary sharp or flat signs, for Musica Ficta - --- print out both editions from the same source. -. * write smobifying howto. -. * put property test files in refman. -. * alignment within @itemize -. * interstaff stems -. * junk dstream output. -. * Change website to be index to documentation. -. * \grace { c d } c1 in midi -. * \prop slurdir in grace notes -. * Make fingering and playing instructions Music_wrappers? -. * script columns -. * Must stop before this music ends: -verse=\lyrics { -. * input/test/grace.sly: wierd big spacing on grace notes -. * TODO^2: -. * make a TODO.texi, like http://www.gnu.org/software/guile/ideas.html -. * make this file understandable for 3rd parties. -. * \accepts -> \acceptedby -. * context in embedded SCM errors. -. * acc at tied note after linebreak. -. * fontSize for time sigs and beams. -. * fix font-naming and selecting -. * add context information to warnings -Paper: -waarschuwing: Kan niet beide uiteinden van bindingsboog vinden -MIDI: -pa.ly:33:23: waarschuwing: Schroot verzoek: `Span_req': - g' a4 bes8 \grace f8( - )es16 d es8 r c | -. * chord tonic: placement of accidental C#, Cb (from scm and C++) -. * note head on stem err msg in dutch. -. * why need to run -C mf twice? -. * here's no difference at all in output. When either is jacked up to 7.0, -everything works and matches up; when either is set just a bit above the -default 5.0 (5.4 is what I was hoping to use), stems miss note heads. So -it's some sort of a numerical (truncation/roundoff) problem. -John -. * fix #'margin-shape; setting indent to 0 with \shape fails -. * Fixed size staff/system heights; -. * ly2dvi : don't repeat opus if same. -. * hara kiri _8 clef. -. * junk -M ? -. * mudela-book doco -. * bracket pdf hack -. * Added StaffContents and RhythmicStaffContents context, they are -between Staff (which groups the elements), and generates the Staff -level elements (key, clef, meter, etc). This construction makes -\consistsend redundant - -. * Mondrup: -- if I change the property minVerticalAlign in a multi staff score with -lyrics the change affects the lyrics too. I would like the change to -_only_ affect staves. -- after the leading measure in the above mentioned score I want a double -bar line fully drawn across the staves and after that keep to the -ChoirStaff bar line types in the rest of the scores -. * Write script that uses --find-old-relative to do auto relativization. - - -.* Cleanups needed -. * \$ and $ identifier syntax in examples. -. * Key_engraver, Local_key_item -. * Think of comprehensive solution for "if (grace_b == self_grace_b_)" -. * String[String.length] doesn't trap. -. * Rhythmic_column and interaction stem/rhythmic_column/note_head/dots. -. * clef engraver -. * parser -. * Lookup::text -> needs to be TeX independent. -. * junk Music_iterator::first_b_ - -.* ACCIDENTALS -. * half-sharps, half-flats -. * adaptive accidental spacing. -. * accidentals closer to note head - - -.* BEAMS -. * [c8. c16 c16 c16] in 6/8 timesig. -. * Rewrite Stem, Beam (hairy) -. * beams over barlines -. * autoBeamMelisma: if I explicitly beam notes in a staff with auto -beaming disabled I would like to have these beams also to be -melismatic. -. * The stemLength property should affect also beamed stems. -. * staffside spanner (crescendo!) along with staffswitch. -. * * auto melismaBusy for beams. - -. * \context Staff < -> {\voiceone''4. r8} -> \voicetwo c,4 r4} -> > -. * \time forces keysig? - -.* STUFF -. * We need feta-din*.mf files for more sizes than 10. -. * align left edge of broken tuplet-spanner (have a test case?) -. * fix dynamics decently, ie. use kerning & ligatures. -. * key restorations & repeats -. * paperXX.ly \quartwidth, font setting not up to date. (Should read from AFM?) -. *In Caro Mio Ben, bar 8, there's a syllable that starts on a note, and -ends on a pair of grace notes. Standard practice is to mark this with -a slur starting on the main note and ending on the grace note, so a -singer knows where to break the words. - -In bar 27, there's a crescendo that's supposed to start at the start -of the grace notes and extend to the note after the grace notes. -. * 4. Lyrics and grace sections don't go too well together. - The words are aligned with the main note, not the start of the - grace note. This is usually wrong, but is sometimes right. -. * rhythmic staff & accidentals. -. * use melismaBusy in Lyric context to typeset melismata correctly. -. * ly2dvi/lilypond logfile. -. * hang Item on Spanner -. * do --safe for PS output? -. * msgfmt -o check? -. * collision of lyrics with span_bars. See star-spangled. -. * It is impossible to typeset two textual scripts that are stacked - on top of each other and avoids note collisions and at the same - time are typeset with different textStyle. I tried to move around - the text_engraver and other engravers between Voice and Thread - but the granularity is not fine enough, the scripts have to - share the same engraver in order to be get correct vertical - position but than they cannot have different style. - In my opinion, all scripts that share the same staff, should - be stacked vertically, avoiding collisions with the notes - in all voices. - -. * Matanya's tips: -. * don't shorten stems/staffs closer to each other. -. * to space the staffs/staffgroups contained in the score. -. * heavier beams? -. * Abstraction for engravers: -. * make "in-between" engraver (Tie) -. * make wide_spanner_engraver (line_group_spanner, staff_symbol) -. * store req -> element, element -> element causes for warnings -. * My wish list for lyrics. I dream of a time when I will have enough time to -become familiar enough with the source code to be able to implement some of -these myself, but I don't know when that will be, so I thought I'd "publish" -my suggestions in case someone else is in a position to give them some -priority. Otherwise, perhaps they could go on the todo list? - -If any of these are already implemented, please let me what the syntax is to -use them! - -1. Stanza numbering. Numbering at the beginning of a song with the number -set to the left of the first note. It would also be nice (but not as -important) to be able to have some form of automatic numbering at the -beginning of each new line. This would make it easier to follow songs with a -large number of stanzas. - -3. Notes centred above/below lyrics rather than left-aligned. - -4. It would be very nice to be able to build some kind of phrasing into the -lyrics of hymns, etc, so that the first words of a phrase are left aligned -with each other, the last words are right aligned, and the words in between -are centred. - -5. In a song, with (say) four stanzas and a chorus, it would be nice to be -able to vertically align the chorus midway between the staves. - -6. It would be nice to be able to put vertical brackets either side of a -repeated section with different words for each repeat. -. * Give # lines in linebreaking. -. * arrows on slurs. -. * rewrite context defs using Scheme -. * junk TeX specifics from internal code. -. * \selectmusic to cut pieces from music. -. * formatting of input stuff. -. * deps for ly2dvi -. * Align_element::padding ? -. * use streambufs and iostream -to provide IO handling for TeX stream, mudela stream, data-file. -. * seriously buffer TeX output (do profile of writing .5 mb TeX file.) -. * uniformise recent feta contributions. -. * bigger and fatter 4/4 C -. * relative mode for midi2ly -. * junking \skip req in lyrics -. * midi2ly empty staffs. -. * use Fourier transformation for rhythmic quantisation. -. * horizontal centering of dynamics -. * $DEPENDENCIES_OUTPUT support -. * turn slope-damping on/off -. * sort out directory stuff. -. * --prefix option? -. * -I option per filetype? -. * kpathsea? -. * declaring Performers -. * text-items clash with stems/beams -. * --include, -I option for ly2dvi (pass on to lily) -. * fix placement of beam-less abbrev -. * Musical_pitch (analogous to Duration and Rhythmic_req) - think about, analogous to pitch: - * { a4 a16 } c <-- duration of c? - * < a4 b8 > c <-- duration of c? -. * \tempo 4. = 90; -. * do rest-collisions for Multi_measure_rests as well. -. * split error/warning in error/warning/non_fatal_error -. * discourage breaking of slurs -. * fix variable define/lookup parser global<->paper -. * fix title/instrument placements; see input/test/title.ly -. * <\voiceone c4. \voicetwo c4> -. * I'd like to change the \repetitions command to Jan's suggested - syntax: \repeat "repeatsymbol" 2 {...}, but I'm not sure that - I understand the implementation of repeats well enough. -. * add mudela-book-doc source to webstie. -. * fix singleStaffBracket -. * move paper vars into engraver properties -. * add new glyphs to font.ly -. * more intelligent file searching -. * disable spaces in TeX stuff -. * handle ^C for tmp/file creation. -. * make LilyPond RPM fully relocatable -. * didot / big point. -. * clefs (AG): The "8" should appear closer to the actual clef, -touching it. -. * put errorlevel in Input class -. * junk nesting slurs - - -.* FONT -. * the bracket is ugly (wings are too parabolic, should be more circular) -. * fix accordion turning paths. -. * versioning for Feta -. * rewrite dynamic signs. They're kind of spaghetti now. -. * The `3' in the meter key is a one or two pixels too thin (at 600dpi) - in the middle: -. * design macro for penstroke with rounded endings -. * timesig C: fat yet less curved. Check out relations. -. * design decent macro for bulbed endings -. * printer dependencies. -. * versioning -. * lo-res fixes. -. * work out sizes of character fonts. -. * more symbols -. * piano pedals: Ped/* -. * coda signs: Segno, O+ -. * glissando, arpeggio -. * lengthened trill -. * include important spacing dims in fetalog -. * scalability: use blot_diameter everywhere, make font chubbier for - small sizes. - -.* 3RD PARTY BUGS -. * UMR: Uninitialized memory read - This is occurring while in: - qst [qsort.c] - qsort [libc.so.1] - Keyword_table::Keyword_table(Keyword_ent*) [keyword.cc:28] - My_lily_lexer::My_lily_lexer() [my-lily-lexer.cc:78] - My_lily_parser::parse_file(String,String) [my-lily-parser.cc:54] - do_one_file(String,String) [scores.cc:124] - Reading 4 bytes from 0xefffeca8 on the stack. - Address 0xefffeca8 is 728 bytes below frame pointer in function -. * patch: don't touch timestamp if all patches fail. -. * MetaPost: should not generate setgray for unfill -. * glibc 2.0: - f = fopen ("/dev/null", "r") - assert (feof (f)) -. * Texinfo, add [ A | B | C ] style tocs to .html output, and don't rely - on @node names for html tocs. - -.* PROJECTS -. * Scripts: -. * stack scripts in chords: - % fingering: footing: - < a-4 c-2 g-1 > < c-\ltoe e-\lheel > -. * script-spacing -. * slur parts as a script -. * stack parameterised scripts for fingering and footing: - -. * convert-mudela: -. * better parsing -. * make smarter -. * convert-mudela -e empty.ly - -. * emacs mudela-mode -. * should handle block comments too. -. * handle lexer modes (\header, \melodic, \lyric) etc. -. * indentation -. * notenames? -. * fontlock: \melodic \melodic - -. * use properties for: -. * default tempo. - -. * page handling: -. * PS output -. * optimal pagebreaking. - -. * internationalisation for input. -. * Unicode support? -> man 7 unicode -. * (The explanation below is mostly intended for Han-Wen and Jan) -> Before, the font was changed with macros declared separately for -> pure TeX and LaTeX, but now all the fonts are declared directly in -> the generated code using the low-level TeX commands. This circumvents -> the fontencoding mechanism of LaTeX and is a potential source of -> problems also for us users of the Latin-1 character set. -> I think it still works since the inputencoding latin1 is -> declared by ly2dvi, but it still means that e.g. an o with -> umlaut is typeset as a combination of the two symbols 'o' and -> 'umlaut' instead of as a single character, as would be the case -> if fontencoding OT1 had been used. This shouldn't give any -> difference in layout, though. One of the main argument for using -> fontencoding OT1 is for the hyphenation mechanism to work, an -> argument that's clearly irrelevant in our application. Yet we -> see the problem for August. - -. * \header -. * output header info to MIDI too. -. * dump \header into easily parsable format. - -. * chords -. * guitar chords (fret diagrams) -. * other chord name styles (american(?) style) -. * basso continuo -. * MIDI output? - -. * Debug logs: -. * derive lily_stream, Dstream, texstream from ostream? -. * indentable stream as baseclass for TeX stream, lily stream, Dstream. -. * use dstream feature in midi2ly -. * integrate IO checking into stream class - -. * input converters -. * NIFF? -. * musedata - -. * add to MIDI output: -. * sharp / flat on trills (in MIDI ??) -. * ornaments (and trills?) -. * slurs -. * accents -. * dynamics -. * account for rhythmic position in measure -. * etc. - - -. * logfile output? - -. * PS -. * speed up PS code. -. * PS lines to .eps files -. * write custom prolog -. * fix ps font switching - -. * more spanners (smallish) -. * Glissando -. * trill - -. * Keys: -. * merge key{item} & localkey{item}? -. * spacing - -. * Support for TAB -. * redo Notehead to allow digits as heads -. * add a \tablature {} lexer mode for easy entering - -. * should adjust stemlength for flag number. - -. * breaking: -. * specify number of lines - -.* INPUTLANGUAGE -. * convention for slurs vs. phrasing marks. -. * Language: -. * \translator -> ? -. * fix \partial -. * \bla {} vs \bla ; -. * \once\property KEY = VAL -. * input property -. * Figure out semicolons. -. * 4 ? -. * configure pitch_byte -. * rest name configurable - - -.* SMALLISH PROJECTS - -. * lyric in staff (sharpsharp in staff, text below) - -. * write Dynamic_line (to group dynamics horizontally) - -. * handle EOF graciously in error messages. - -. * midi esp.: use I32 iso int where 32 bits are needed (or assumed...) - -. * lily \tempo - -. * % toe to bheel four to five - % ^_u 4_5 - % - - % --|x-- --|x-- - % --|--- --|--- - % --|--- --|--- - (where "to" is a tiny bow) - -. * Text_crescendo - -.* IDEAS -. * Output data structures of Mudela in XML/SGML. -. * create libmudela, or liblily_frontend -. * move MIDI stuff (including Quantization) to a ANSI C libmidi library. - -* OUTLINE SETUP -.* .EMACS -;;; from outline.el -(defvar outline-font-lock-keywords - '(;; Highlight headings according to the level. - ;; must change this to allout node layout - ;;("^\\(\\*+\\)[ \t]*\\(.+\\)?[ \t]*$" - ("^\\([.]*[ ]*[*]\\)[ \t]*\\(.*\\)$" - (1 font-lock-string-face) - (2 (let ((len (- (match-end 1) (match-beginning 1)))) - (or (cdr (assq len '((1 . font-lock-function-name-face) - (2 . font-lock-keyword-face) - (3 . font-lock-comment-face)))) - font-lock-variable-name-face)) - nil t)) - ;; Highlight citations of the form [1] and [Mar94]. - ("\\[\\([A-Z][A-Za-z]+\\)*[0-9]+\\]" . font-lock-type-face)) - "Additional expressions to highlight in Outline mode.") - -(add-hook 'outline-mode-hook - '(lambda () - (setq font-lock-maximum-decoration t) - (setq font-lock-maximum-decoration t) - (make-local-variable 'font-lock-defaults) - (setq font-lock-defaults '(outline-font-lock-keywords t)) - (font-lock-mode global-font-lock-mode) - )) - -(require 'allout) -(outline-init 't) - - +[see http://www.cs.uu.nl/people/hanwen/lily-devel/index.html] diff --git a/VERSION b/VERSION index f1b86883ae..023bbc67de 100644 --- a/VERSION +++ b/VERSION @@ -1,8 +1,8 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=3 -PATCH_LEVEL=30 -MY_PATCH_LEVEL=jcn2 +PATCH_LEVEL=31 +MY_PATCH_LEVEL= # use the above to send patches: MY_PATCH_LEVEL is always empty for a # released version. diff --git a/flower/include/unionfind.hh b/flower/include/unionfind.hh deleted file mode 100644 index b83a673a5d..0000000000 --- a/flower/include/unionfind.hh +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef UNIONFIND_HH -#define UNIONFIND_HH -#include "array.hh" - -/** - which points of a graph are connected?. - Union find, a standard algorithm: - - Union_find represents an undirected graph of N points. You can - connect two points using #connect()#. #find (i)# finds a uniquely - determined representant of the equivalence class of points - connected to #i#. - - */ -struct Union_find { - void connect (int i, int j); - int find (int i); - bool equiv (int i, int j) { return find (i) == find (j); } - Union_find (int sz); - - /** - This array provides the representing point for each node in the graph. - */ - Array classes_; -}; -#endif diff --git a/flower/unionfind.cc b/flower/unionfind.cc deleted file mode 100644 index cb5afce6e4..0000000000 --- a/flower/unionfind.cc +++ /dev/null @@ -1,37 +0,0 @@ -#include "unionfind.hh" -/* - see a book on data structures - */ - -Union_find::Union_find (int n) -{ - classes_.set_size (n); - - for (int i=0; i < n; i++) - { - classes_[i] = i; - } -} - -int -Union_find::find (int i) -{ - int rep = i; - while (classes_[rep] != rep) - rep = classes_[rep]; - while (classes_[i] != rep) - { - int next =classes_[i]; - classes_[i] = rep; - i = next; - } - return rep; -} - -void -Union_find::connect (int i, int j) -{ - i = find (i); - j = find (j); - classes_[i] = j; -} diff --git a/input/test/crescendi.ly b/input/test/crescendi.ly new file mode 100644 index 0000000000..3d47741875 --- /dev/null +++ b/input/test/crescendi.ly @@ -0,0 +1,17 @@ +\score{ +\notes\relative c''{ +a1\fff\< \!a +a\> \!a +\property Voice.crescendoText = "cresc." +\property Voice.crescendoSpanner = "dashed-line" +a\mf\cresc \endcresc a +%a\decresc \enddecresc a +a1\< \!a +a\> \!a +} +\paper{ +} +\midi{ +\tempo 1 = 60; +} +} diff --git a/input/test/span-dynamic.ly b/input/test/span-dynamic.ly new file mode 100644 index 0000000000..8c48f7d3a0 --- /dev/null +++ b/input/test/span-dynamic.ly @@ -0,0 +1,17 @@ +\score{ +\notes\relative c''{ +a1\ppp\< +a +a +a +a +a +a +\!a\fff +} +\paper{ +} +\midi{ +\tempo 1 = 60; +} +} diff --git a/lily/crescendo.cc b/lily/crescendo.cc index bdf26864df..ca1cf50cd0 100644 --- a/lily/crescendo.cc +++ b/lily/crescendo.cc @@ -69,28 +69,45 @@ Crescendo::do_brew_molecule () const Drul_array broken; Direction d = LEFT; - do { - Paper_column* s = dynamic_cast(spanned_drul_[d]); // UGH - broken[d] = (!s->musical_b ()); - } while (flip (&d) != LEFT); + do + { + Paper_column* s = dynamic_cast(spanned_drul_[d]); // UGH + broken[d] = (!s->musical_b ()); + } + while (flip (&d) != LEFT); - bool continued = broken[Direction (-gd)]; - Real height = paper_l()->get_var ("crescendo_height"); - Real thick = paper_l ()->get_var ("crescendo_thickness"); - - const char* hairpin = (gd < 0)? "decrescendo" : "crescendo"; - - Box b (Interval (0, width), - Interval (-2*height, 2*height)); - - SCM at = gh_list (ly_symbol2scm (hairpin), - gh_double2scm (thick), - gh_double2scm (width), - gh_double2scm (height), - gh_double2scm (continued ? height/2 : 0.0), - SCM_UNDEFINED); - + SCM at; + SCM s = get_elt_property ("spanner"); + Real height; + if (gh_string_p (s) && ly_scm2string (s) == "dashed-line") + { + Real thick = paper_l ()->get_var ("crescendo_dash_thickness"); + Real dash = paper_l ()->get_var ("crescendo_dash"); + height = thick; + at = gh_list (ly_symbol2scm (ly_scm2string (s).ch_C ()), + gh_double2scm (thick), + gh_double2scm (dash), + gh_double2scm (width), + SCM_UNDEFINED); + } + else + { + bool continued = broken[Direction (-gd)]; + height = paper_l()->get_var ("crescendo_height"); + Real thick = paper_l ()->get_var ("crescendo_thickness"); + + const char* hairpin = (gd < 0)? "decrescendo" : "crescendo"; + + at = gh_list (ly_symbol2scm (hairpin), + gh_double2scm (thick), + gh_double2scm (width), + gh_double2scm (height), + gh_double2scm (continued ? height/2 : 0.0), + SCM_UNDEFINED); + } + + Box b (Interval (0, width), Interval (-2*height, 2*height)); Molecule m (b, at); m.translate_axis (extra_left, X_AXIS); diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index 88de9812a2..254271080f 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -22,7 +22,9 @@ /* TODO: - multiple type of span dynamic: + * why handle absolute and span requests in one cryptic engraver, + what about Span_dynamic_engraver? + * hairpin * text: - `cresc. -- -- --' @@ -34,7 +36,8 @@ */ class Dynamic_engraver : public Engraver { - Text_item * text_p_; + Text_item * abs_text_p_; + Text_item * cr_text_p_; Crescendo * to_end_cresc_p_; Crescendo * cresc_p_; @@ -70,10 +73,9 @@ Dynamic_engraver::announce_element (Score_element_info i) Dynamic_engraver::Dynamic_engraver() { do_post_move_processing(); - text_p_ =0; - + abs_text_p_ = 0; + cr_text_p_ = 0; to_end_cresc_p_ = cresc_p_ = 0; - cresc_req_l_ = 0; } @@ -121,7 +123,7 @@ Dynamic_engraver::do_process_requests() if (Text_script_req *absd = dynamic_cast ( dynamic_req_l_arr_[i])) { - if (text_p_) + if (abs_text_p_) { dynamic_req_l_arr_[i]->warning (_("Got a dynamic already. Continuing dazed and confused.")); continue; @@ -129,19 +131,19 @@ Dynamic_engraver::do_process_requests() String loud = absd->text_str_; - text_p_ = new Text_item; - text_p_->set_elt_property ("text", + abs_text_p_ = new Text_item; + abs_text_p_->set_elt_property ("text", ly_str02scm (loud.ch_C())); - text_p_->set_elt_property ("style", gh_str02scm ("dynamic")); - text_p_->set_elt_property ("script-priority", + abs_text_p_->set_elt_property ("style", gh_str02scm ("dynamic")); + abs_text_p_->set_elt_property ("script-priority", gh_int2scm (100)); - Side_position_interface (text_p_).set_axis (Y_AXIS); + Side_position_interface (abs_text_p_).set_axis (Y_AXIS); if (absd->get_direction ()) { - text_p_->set_elt_property ("direction", gh_int2scm (absd->get_direction ())); + abs_text_p_->set_elt_property ("direction", gh_int2scm (absd->get_direction ())); } @@ -155,14 +157,14 @@ Dynamic_engraver::do_process_requests() } if (isdir_b (prop) && to_dir (prop)) - text_p_->set_elt_property ("direction", prop); + abs_text_p_->set_elt_property ("direction", prop); prop = get_property ("dynamicPadding"); if (gh_number_p(prop)) { - text_p_->set_elt_property ("padding", prop); + abs_text_p_->set_elt_property ("padding", prop); } - announce_element (Score_element_info (text_p_, absd)); + announce_element (Score_element_info (abs_text_p_, absd)); } else if (Span_req *span_l = dynamic_cast (dynamic_req_l_arr_[i])) @@ -186,10 +188,50 @@ Dynamic_engraver::do_process_requests() cresc_req_l_ = span_l; assert (!new_cresc_p); new_cresc_p = new Crescendo; - new_cresc_p - ->set_elt_property ("grow-direction", - gh_int2scm ((span_l->span_type_str_ == "crescendo") ? BIGGER : SMALLER)); + new_cresc_p->set_elt_property + ("grow-direction", + gh_int2scm ((span_l->span_type_str_ == "crescendo") + ? BIGGER : SMALLER)); + SCM s = get_property (span_l->span_type_str_ + "Text"); + if (gh_string_p (s)) + { + cr_text_p_ = new Text_item; + cr_text_p_->set_elt_property ("text", s); + // urg + cr_text_p_->set_elt_property ("style", gh_str02scm ("italic")); + // ? + cr_text_p_->set_elt_property ("script-priority", + gh_int2scm (100)); + + /* + This doesn't work. + I'd like to have support like this: + | + x| + cresc. - - - + + or + | + x| + ff cresc. - - - + + */ + if (0) //abs_text_p_) + { + Side_position_interface (cr_text_p_).set_axis (X_AXIS); + Side_position_interface (cr_text_p_).add_support (abs_text_p_); + } + //Side_position_interface (cr_text_p_).set_axis (Y_AXIS); + announce_element (Score_element_info (cr_text_p_, span_l)); + } + + s = get_property (span_l->span_type_str_ + "Spanner"); + if (gh_string_p (s)) //&& ly_scm2string (s) != "hairpin") + { + new_cresc_p->set_elt_property ("spanner", s); + } + side_position (new_cresc_p).set_axis (Y_AXIS); announce_element (Score_element_info (new_cresc_p, span_l)); } @@ -210,7 +252,8 @@ Dynamic_engraver::do_process_requests() cresc_p_ = new_cresc_p; cresc_p_->set_bounds(LEFT,get_staff_info().musical_pcol_l ()); - if (text_p_) + // arrragh, brr, urg: we know how wide text is, no? + if (abs_text_p_) { index_set_cell (cresc_p_->get_elt_property ("dynamic-drul"), LEFT, SCM_BOOL_T); @@ -256,10 +299,16 @@ Dynamic_engraver::typeset_all () } - if (text_p_) + if (abs_text_p_) + { + typeset_element (abs_text_p_); + abs_text_p_ = 0; + } + + if (cr_text_p_) { - typeset_element (text_p_); - text_p_ =0; + typeset_element (cr_text_p_); + cr_text_p_ = 0; } } @@ -277,8 +326,14 @@ Dynamic_engraver::acknowledge_element (Score_element_info i) || dynamic_cast (i.elem_l_) ) { - if (text_p_) - Side_position_interface (text_p_).add_support (i.elem_l_); + if (abs_text_p_) + Side_position_interface (abs_text_p_).add_support (i.elem_l_); + + if (cr_text_p_) ///&& !abs_text_p_) + { + Side_position_interface (cr_text_p_).set_axis (Y_AXIS); + Side_position_interface (cr_text_p_).add_support (i.elem_l_); + } if (to_end_cresc_p_) Side_position_interface (to_end_cresc_p_).add_support (i.elem_l_); diff --git a/lily/tie-performer.cc b/lily/tie-performer.cc index a05b54cce6..b9109b9d86 100644 --- a/lily/tie-performer.cc +++ b/lily/tie-performer.cc @@ -23,10 +23,13 @@ Tie_performer::Tie_performer() bool Tie_performer::do_try_music (Music *m) { - if (Tie_req * c = dynamic_cast (m)) + if (!req_l_) { - req_l_ = c; - return true; + if (Tie_req * c = dynamic_cast (m)) + { + req_l_ = c; + return true; + } } return false; } diff --git a/lily/tie.cc b/lily/tie.cc index 7f1befbf66..87de462d73 100644 --- a/lily/tie.cc +++ b/lily/tie.cc @@ -232,7 +232,8 @@ Tie::get_curve () const Real ry = rint (y/staff_space) * staff_space; Real diff = ry - y; Real newy = y; - if (fabs (diff) < paper_l ()->get_var ("tie_staffline_clearance")) + if (fabs (y) <= 2.0 + && fabs (diff) < paper_l ()->get_var ("tie_staffline_clearance")) { newy = ry - 0.5 * staff_space * sign (diff) ; } diff --git a/ly/params.ly b/ly/params.ly index 5c5d505123..d02f17dd97 100644 --- a/ly/params.ly +++ b/ly/params.ly @@ -175,6 +175,8 @@ multi_measure_rest_expand_limit = 10.0; crescendo_shorten = 4.0 * \staffspace; crescendo_thickness = \stafflinethickness; crescendo_height = 0.666 * \staffspace; +crescendo_dash_thickness = 1.2*\stafflinethickness; +crescendo_dash = 4.0*\staffspace; % in internote. restcollision_minimum_dist = 3.0; diff --git a/ly/performer.ly b/ly/performer.ly index 21ec1095f2..132d0e8c84 100644 --- a/ly/performer.ly +++ b/ly/performer.ly @@ -14,6 +14,7 @@ StaffContext = \translator { \consists "Key_performer"; \consists "Time_signature_performer"; \consists "Tempo_performer"; +% \consists "Span_dynamic_performer"; dynamicStyle = #"dynamic" }; \translator { \StaffContext } @@ -43,6 +44,7 @@ VoiceContext = \translator { \name Voice; % All notes fall to Grace if you leave Thread out (huh?) \consists "Dynamic_performer"; % must come before text_engraver. + \consists "Span_dynamic_performer"; \consists "Grace_position_performer"; \accepts Thread; \accepts Grace; diff --git a/ly/property.ly b/ly/property.ly index d416d2edd9..8fe96e79a8 100644 --- a/ly/property.ly +++ b/ly/property.ly @@ -123,3 +123,4 @@ autoBeamOn = \property Voice.noAutoBeaming = ##f emptyText = \property Voice.textEmptyDimension = ##t fatText = \property Voice.textEmptyDimension = ##f + diff --git a/ly/spanners.ly b/ly/spanners.ly index bf8cafcee2..b21bcc7165 100644 --- a/ly/spanners.ly +++ b/ly/spanners.ly @@ -5,3 +5,23 @@ cr = \spanrequest \start "crescendo" decr = \spanrequest \start "decrescendo" rc = \spanrequest \stop "crescendo" rced = \spanrequest \stop "decrescendo" + +%% urg, these don't work yet. +xcresc = { +%\spanrequest \start "crescendo" +\property Voice.crescendoText = "cresc." +\property Voice.crescendoSpanner = "dashed" +} + +xendcresc = { +%\spanrequest \start "crescendo" +\property Voice.crescendoText = ##f +\property Voice.crescendoSpanner = ##f +} + +cresc = \spanrequest \start "crescendo" +endcresc = \spanrequest \stop "crescendo" + +%crescpoco = \property Voice.crescendoText = "cresc. poco a poco" +%decresc = \property Voice.crescendoText = "decr." +%dim = \property Voice.crescendoText = "dim." diff --git a/make/mutopia-targets.make b/make/mutopia-targets.make index 8fd9880957..769b7ab8fe 100644 --- a/make/mutopia-targets.make +++ b/make/mutopia-targets.make @@ -4,7 +4,6 @@ all: $(OUT_FILES) local-WWW: $(ly_examples) $(fly_examples) $(ps_examples) $(png_examples) # (cd $(outdir); $(PYTHON) ../$(buildscripts)/mutopia-index.py --prefix=../ --suffix=/$(outdir) $(html_subdirs) $(all_examples)) -# echo $^ > $(depth)/wwwlist # $(footify) $(outdir)/index.html local-web: diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm index 757b492e98..fa4818f2ea 100644 --- a/make/out/lilypond.lsm +++ b/make/out/lilypond.lsm @@ -1,15 +1,15 @@ Begin3 Title: LilyPond -Version: 1.3.30 -Entered-date: 06MAR00 +Version: 1.3.31 +Entered-date: 09MAR00 Description: 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.30.tar.gz + 1000k lilypond-1.3.31.tar.gz Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/ - 1000k lilypond-1.3.30.tar.gz + 1000k lilypond-1.3.31.tar.gz Copying-policy: GPL End diff --git a/make/out/lilypond.spec b/make/out/lilypond.spec index f06d1a84b7..a8e3f0b345 100644 --- a/make/out/lilypond.spec +++ b/make/out/lilypond.spec @@ -1,9 +1,9 @@ Name: lilypond -Version: 1.3.30 +Version: 1.3.31 Release: 1 Copyright: GPL Group: Applications/Publishing -Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.30.tar.gz +Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.31.tar.gz Summary: A program for printing sheet music. URL: http://www.cs.uu.nl/~hanwen/lilypond # get Packager from (undocumented?) ~/.rpmmacros! diff --git a/ps/lily.ps b/ps/lily.ps index c88e20c71e..72da29ec20 100644 --- a/ps/lily.ps +++ b/ps/lily.ps @@ -104,7 +104,7 @@ } bind def % % this is for drawing slurs. -/draw_bezier_sandwich % thickness +/draw_bezier_sandwich % thickness controls { setlinewidth moveto @@ -117,7 +117,18 @@ stroke } bind def % -/draw_dashed_slur +/draw_dashed_line % dash thickness width +{ + 1 setlinecap + 1 setlinejoin + setdash + setlinewidth + 0 0 moveto + 0 lineto + stroke +} bind def +% +/draw_dashed_slur % dash thickness controls { 1 setlinecap 1 setlinejoin diff --git a/scm/lily.scm b/scm/lily.scm index f2b009aa9e..841ecade60 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -281,6 +281,9 @@ (define (char i) (string-append "\\char" (inexact->string i 10) " ")) + (define (dashed-line thick dash w) + (embedded-ps ((ps-scm 'dashed-line) thick dash w))) + (define (decrescendo thick w h cont) (embedded-ps ((ps-scm 'decrescendo) thick w h cont))) @@ -405,6 +408,7 @@ (define bracket ,bracket) (define char ,char) (define crescendo ,crescendo) + (define dashed-line ,dashed-line) (define dashed-slur ,dashed-slur) (define decrescendo ,decrescendo) (define end-output ,end-output) @@ -431,6 +435,7 @@ ((eq? action-name 'tuplet) tuplet) ((eq? action-name 'bracket) bracket) ((eq? action-name 'crescendo) crescendo) + ((eq? action-name 'dashed-line) dashed-line) ((eq? action-name 'dashed-slur) dashed-slur) ((eq? action-name 'decrescendo) decrescendo) ((eq? action-name 'end-output) end-output) @@ -538,6 +543,17 @@ (number->string (* 10 thick)) ;UGH. 10 ? " ] 0 draw_dashed_slur")) + (define (dashed-line thick dash width) + (string-append + (number->string width) + " " + (number->string thick) + " [ " + (number->string dash) + " " + (number->string dash) + " ] 0 draw_dashed_line")) + (define (decrescendo thick w h cont) (string-append (numbers->string (list w h (inexact->exact cont) thick)) @@ -641,6 +657,7 @@ (define crescendo ,crescendo) (define volta ,volta) (define bezier-sandwich ,bezier-sandwich) + (define dashed-line ,dashed-line) (define dashed-slur ,dashed-slur) (define decrescendo ,decrescendo) (define end-output ,end-output) @@ -668,6 +685,7 @@ ((eq? action-name 'bracket) bracket) ((eq? action-name 'char) char) ((eq? action-name 'crescendo) crescendo) + ((eq? action-name 'dashed-line) dashed-line) ((eq? action-name 'dashed-slur) dashed-slur) ((eq? action-name 'decrescendo) decrescendo) ((eq? action-name 'experimental-on) experimental-on) diff --git a/stepmake/stepmake/documentation-targets.make b/stepmake/stepmake/documentation-targets.make index 7223b973c4..8172d03b0b 100644 --- a/stepmake/stepmake/documentation-targets.make +++ b/stepmake/stepmake/documentation-targets.make @@ -3,7 +3,6 @@ default: local-WWW: $(OUTHTML_FILES) - echo $^ > $(depth)/wwwlist local-web: $(MAKE) CONFIGSUFFIX=www local-WWW diff --git a/stepmake/stepmake/yolily-toplevel-targets.make b/stepmake/stepmake/yolily-toplevel-targets.make index 4de1e45739..73565b8c2e 100644 --- a/stepmake/stepmake/yolily-toplevel-targets.make +++ b/stepmake/stepmake/yolily-toplevel-targets.make @@ -17,11 +17,11 @@ htmldoc: $(MAKE) CONFIGSUFFIX='www' -C Documentation WWW rm -f `find . -name \*.html~ -print` $(footify-all-command) - find `find Documentation -type d -name 'out-www'` -not -name '*dvi' -not -name '*ly' -not -name '*tex' -not -name '*.ps' -not -name 'out-www' > wwwlist + find `find Documentation -type d -name 'out-www'` -not -name '*dvi' -not -name '*ly' -not -name '*tex' -not -name '*.ps' -not -name 'out-www' tar cfz $(outdir)/htmldoc.tar.gz `cat wwwlist` `ls *.png $(ERRORLOG)` index.html localclean: - rm -f wwwlist + # if you fix this, please fix yodl too! check-top-web: -- 2.39.2