From: Han-Wen Nienhuys Date: Tue, 21 Apr 1998 00:00:37 +0000 (+0200) Subject: release: 0.1.58 X-Git-Tag: release/0.1.58 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=472c212541034e95c30f5a1a6bc99d7f36f15b68;p=lilypond.git release: 0.1.58 --- diff --git a/AUTHORS.txt b/AUTHORS.txt index c4e28e7233..c3f40ad67e 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -61,7 +61,7 @@ CONTRIBUTORS -6/Apr/98 LilyPond 0.1.57 1 +6/Apr/98 LilyPond 0.1.58 1 @@ -127,6 +127,6 @@ AUTHORS(1) LilyPond documentation AUTHORS(1) -6/Apr/98 LilyPond 0.1.57 2 +6/Apr/98 LilyPond 0.1.58 2 diff --git a/Documentation/INSTALL.pod b/Documentation/INSTALL.pod index 7f032b20ea..b1fd8f6f76 100644 --- a/Documentation/INSTALL.pod +++ b/Documentation/INSTALL.pod @@ -68,7 +68,7 @@ GNU make. =item * -Flex (version 2.5.1 or newer). +Flex (version 2.5.4 or newer). =item * diff --git a/Documentation/Makefile b/Documentation/Makefile index f10afdbf80..47df8c5935 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -39,7 +39,7 @@ giffiles=$(XPMS:.xpm=.gif) gifs: $(addprefix $(outdir)/, $(giffiles)) -EXTRA_DISTFILES = $(XPMS) $(DOCFILES) vocabulary-data vocabulary-forms.el fonts.tex automake.urgh +EXTRA_DISTFILES = $(XPMS) $(DOCFILES) vocabulary-data vocabulary-forms.el fonts.tex automake.urgh engraving.bib # don't do DVI files. They can only be made if lily is installed do-doc: $(TEXTFILES) diff --git a/Documentation/PATCHES.pod b/Documentation/PATCHES.pod index 6e5e1a134c..7fbc7480c0 100644 --- a/Documentation/PATCHES.pod +++ b/Documentation/PATCHES.pod @@ -44,7 +44,6 @@ In F, enter a summary of changes: Then, from the top of Lily's source tree, type - make distclean # if you don't use --srcdir configure make-patch which leaves your patch as F<./patch-0.1.48.jcn1>. @@ -114,120 +113,3 @@ Then, make a patch as shown above. Han-Wen Nienhuys Just keep on sending those patches! -=head1 NAME - -PATCHES - track and distribute your code changes - -=head1 DESCRIPTION - -This page documents how to distribute your changes to GNU LilyPond - -=head1 ABSTRACT - -Distributing a change normally goes like this: - -=over 5 - -=item * - -make your fix/add your code - -=item * - -generate a patch, - -=item * - -e-mail your patch to one of the mailing lists -gnu-music-discuss@gnu.org or bug-gnu-music@gnu.org -(or if you're a bit shy, to the maintainer). - -=back - -=head1 GENERATING A PATCH - -In F, set TOPLEVEL_MY_PATCH_LEVEL: - - VERSION: - ... - TOPLEVEL_MY_PATCH_LEVEL = jcn1 - -In F, enter a summary of changes: - - NEWS: - pl 0.1.48.jcn1 - - added PATCHES.pod - -Then, type something like - - make-dist - mv out/lilypond-0.1.48.jcn1.tar.gz ../releases - make-patch - -which leaves your patch as F<./patch-0.1.48.jcn1>. - -or even simpler: - - release - - tar-ball: ../patches/patch-0.1.48.jcn1.gz - patch: ../patches/patch-0.1.48.jcn1.gz - updeet: ../test/updeet - -=head1 PREREQUISITES - -For creating a patch you need - -=over 5 - -=item * - -All items mentioned in F. You're not going to send a patch -that you haven't even built, right? - -=item * - -GNU Diff - -=item * - -Python (version 1.4 or newer). -You can of course make a patch by hand, which would go something like: - - make distclean - cd .. - diff -urN lilypond-0.1.48 lilypond-0.1.48.jcn1 > patch-0.1.48.jcn1 - -but there are handy python scripts available. If you're doing development, -you'll need Python for other LilyPond scripts anyway. - -=item * - -The Lily directory structure, which looks like: - - lilypond-0.1.48/ - patches/ - releases/ - test/ - -=back - -=head1 SYNCHRONISE - -If you're not very quick with sending your patch, there's a good chance -that an new release of LilyPond comes available. In such a case (and -sometimes for other unkown reasons :-), the maintainer will probably ask -you to make a new patch against the latest release. -Your best bet is to download the latest release, and apply your patch -against this new source tree: - - cd lilypond-0.1.49 - zpatch -p0 -E < ../patches/patch-0.1.48.jcn1.gz - -Then, make a patch as shown above. - -=head1 MAINTAINER - -Han-Wen Nienhuys - -Just keep on sending those patches! diff --git a/Documentation/Rules.make b/Documentation/Rules.make index fd0b391a2e..b8e14d7d8c 100644 --- a/Documentation/Rules.make +++ b/Documentation/Rules.make @@ -39,7 +39,6 @@ do_pod2html=$(POD2HTML5003) $(outdir)/%.html: %.pod $(depth)/VERSION $(do_pod2html) -# $(outdir)/%.5: %.pod $(pod2groff) diff --git a/Documentation/engraving.bib b/Documentation/engraving.bib new file mode 100644 index 0000000000..5b8a1ba4ba --- /dev/null +++ b/Documentation/engraving.bib @@ -0,0 +1,56 @@ +@Book{wanske, + author = {Helene Wanske}, + ALTeditor = {}, + title = {Musiknotation --- Von der Syntax des Notenstichs zum +EDV-gesteuerten Notensatz}, + publisher = {Schott-Verlag, Mainz}, + year = {1988}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTseries = {}, + OPTaddress = {}, + OPTedition = {}, + OPTmonth = {}, + OPTnote = {ISBN 3-7957-2886-x}, + OPTannote = {} +} + + +@Book{rastall, + author = {Richard Rastall}, + ALTeditor = {}, + title = {The Notation of Western Music: an +Introduction}, + publisher = {J. M. Dent \6& Sons London}, + year = {1983}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTseries = {}, + OPTaddress = {}, + OPTedition = {}, + OPTmonth = {}, + OPTnote = {}, + OPTannote = {} +} + +@Book{ross, +author = {Ted Ross}, + title = {Teach yourself the art of music engraving and processing}, + publisher = {Hansen House}, + year = {1987}, + OPTkey = {}, + OPTvolume = {}, + OPTnumber = {}, + OPTseries = {}, + OPTaddress = {}, + OPTedition = {}, + OPTmonth = {}, + OPTnote = {This is about engraving, i.e. professional typesetting. It contains +directions on good typesetting, but the sections on reproduction +technicalities, how to use pens and history are interesting. +Especially the section on Music Typewriters is amusing HWN}, + OPTannote = {} +} + diff --git a/Documentation/fonts.tex b/Documentation/fonts.tex index 81c87e3c09..e9c18ab9c4 100644 --- a/Documentation/fonts.tex +++ b/Documentation/fonts.tex @@ -8,10 +8,10 @@ \section{Introduction} -Feta (not an abbreviation of Font-En-Tja) is a font of music symbols. -All MetaFont %ugh -sources are original. The symbols are modelled after -various editions of music, notably +This document are some design notes of the Feta font. Feta (not an +abbreviation of Font-En-Tja) is a font of music symbols. All MetaFont +%ugh sources are original. The symbols are modelled after various +editions of music, notably \begin{itemize} \item B\"arenreiter \item Hofmeister @@ -25,16 +25,30 @@ is a matter of taste, I'd say that B\"arenreiter has the finest typography of all. -\section{Bezier curves for simple slurs} +\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. We will assume that the slur connects two notes of the same +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 @@ -64,6 +78,14 @@ $$ 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$. @@ -81,11 +103,71 @@ $$ 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. +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. -\section{Sizes} +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 emperic 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). diff --git a/INSTALL.txt b/INSTALL.txt index 05998b7b4c..43bc7f8126 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -50,7 +50,7 @@ RECOMMENDED o GNU make. - o Flex (version 2.5.1 or newer). + o Flex (version 2.5.4 or newer). o Bison (version 1.25 or newer). =item * @@ -61,7 +61,7 @@ RECOMMENDED -20/Mar/98 LilyPond 0.1.57 1 +21/Apr/98 LilyPond 0.1.58 1 @@ -127,7 +127,7 @@ CONFIGURING and COMPILING -20/Mar/98 LilyPond 0.1.57 2 +21/Apr/98 LilyPond 0.1.58 2 @@ -193,7 +193,7 @@ INSTALLING -20/Mar/98 LilyPond 0.1.57 3 +21/Apr/98 LilyPond 0.1.58 3 @@ -259,7 +259,7 @@ WINDOWS NT/95 -20/Mar/98 LilyPond 0.1.57 4 +21/Apr/98 LilyPond 0.1.58 4 @@ -325,7 +325,7 @@ MUSIXTEX -20/Mar/98 LilyPond 0.1.57 5 +21/Apr/98 LilyPond 0.1.58 5 @@ -391,6 +391,6 @@ AUTHORS -20/Mar/98 LilyPond 0.1.57 6 +21/Apr/98 LilyPond 0.1.58 6 diff --git a/Makefile b/Makefile deleted file mode 100755 index c058487bcb..0000000000 --- a/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -# -*-Makefile-*- -######################################################## -# project LilyPond -- the musical typesetter -# title top level makefile for LilyPond -# file Makefile -# -# Copyright (c) 1997 by -# Jan Nieuwenhuizen -# Han-Wen Nienhuys - -# subdir level: -# -depth = . -# - -# identify module: -# -NAME = lilypond -SUBDIRS = bin flower lib lily mf mi2mu debian\ - Documentation init input tex make mutopia -include VERSION -# - -# descent order into subdirectories: -# - -# list of distribution files: -# -SCRIPTS = configure configure.in aclocal.m4 -README_FILES = BUGS DEDICATION ANNOUNCE-0.1 ANNOUNCE \ - COPYING ONEWS NEWS README TODO \ - INSTALL.txt AUTHORS.txt PATCHES.txt -EXTRA_DISTFILES = config.make.in config.hh.in .dstreamrc mudela-mode.el VERSION $(README_FILES) $(SCRIPTS) - -# do not dist ./Makefile (is copied from make/Toplevel.make) -DISTFILES:=$(EXTRA_DISTFILES) -# - - -# generic targets and rules: -# -include ./$(depth)/make/Version.make -include ./$(depth)/make/Variables.make -include ./$(depth)/make/Targets.make -include ./$(depth)/make/Rules.make - -localdist: configure - -local-distclean: - rm -f config.hh config.make Makefile config.cache config.status config.log - -Makefile: make/Toplevel.make.in - chmod +w $@ - echo '# WARNING WARNING WARNING WARNING' > $@ - echo '# do not edit! this is generated from make/Toplevel.make.in' >> $@ - cat $< >> $@ - chmod -w $@ - diff --git a/NEWS b/NEWS index 5a442c3749..1c262faf47 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,22 @@ - +pl 58 + - more *.make hacking + - bracket fix (AG) + - clef fix (PC) + +pl 57.jcn1 + - reincluded test/bow.cc + - promoted Bezier bows to standard + * bf's: broken slurs + * some bf's: verneukeratificering van JCN code + * some bezier slur doco + * calculate Ties with Bezier bow + * junked tex-slur.cc + * junked ps-slur code + * junked height-only slur-correction + * lots of bezier/slur fixes + * bezier:blow_fit + +************** pl 57 - verneukeratificering van JCN code. - lots of updates on our own makefile system. @@ -14,6 +32,10 @@ pl 57 - solaris/irix patches (AO) +pl 56.jcn5 + - bezier and slur: cleaning and fixes + - bf: removed silly experimental beam feature + pl 56.jcn4 - reintruduced slope in bug [c8 c16 c16] in favour of stemlen bug... - staff-side: accent half line higher diff --git a/PATCHES.txt b/PATCHES.txt index b3775b62c8..6996afe212 100644 --- a/PATCHES.txt +++ b/PATCHES.txt @@ -37,7 +37,6 @@ GENERATING A PATCH Then, from the top of Lily's source tree, type - make distclean # if you don't use --srcdir configure make-patch which leaves your patch as ./patch-0.1.48.jcn1. @@ -57,77 +56,12 @@ PREREQUISITES o All items mentioned in INSTALL. You're not going to send a patch that you haven't even built, right? - - - - -2/Apr/98 LilyPond 0.1.57 1 - - - - - -PATCHES(1) LilyPond documentation PATCHES(1) - - o GNU Diff - o Python (version 1.4 or newer). You can of course - make a patch by hand, which would go something like: - - make distclean - cd .. - diff -urN lilypond-0.1.48 lilypond-0.1.48.jcn1 > patch-0.1.48.jcn1 - - but there are handy python scripts available. If - you're doing development, you'll need Python for - other LilyPond scripts anyway. - - o The Lily directory structure, which looks like: - - lilypond-0.1.48/ - patches/ - releases/ - test/ - - - If you're not very quick with sending your patch, there's - a good chance that an new release of LilyPond comes - available. In such a case (and sometimes for other unkown - reasons :-), the maintainer will probably ask you to make - a new patch against the latest release. Your best bet is - to download the latest release, and apply your patch - against this new source tree: - - cd lilypond-0.1.49 - zpatch -p0 -E < ../patches/patch-0.1.48.jcn1.gz - - Then, make a patch as shown above. - -MAINTAINER - Han-Wen Nienhuys - - Just keep on sending those patches! =head1 NAME - - PATCHES - track and distribute your code changes - -DESCRIPTION - This page documents how to distribute your changes to GNU - LilyPond - -ABSTRACT - Distributing a change normally goes like this: - - o make your fix/add your code - - o generate a patch, - - o e-mail your patch to one of the mailing lists gnu- - music-discuss@gnu.org or bug-gnu-music@gnu.org (or if -2/Apr/98 LilyPond 0.1.57 2 +20/Apr/98 LilyPond 0.1.58 1 @@ -136,46 +70,6 @@ ABSTRACT PATCHES(1) LilyPond documentation PATCHES(1) - you're a bit shy, to the maintainer). - -GENERATING A PATCH - In VERSION, set TOPLEVEL_MY_PATCH_LEVEL: - - VERSION: - ... - TOPLEVEL_MY_PATCH_LEVEL = jcn1 - - In NEWS, enter a summary of changes: - - NEWS: - pl 0.1.48.jcn1 - - added PATCHES.pod - - Then, type something like - - make-dist - mv out/lilypond-0.1.48.jcn1.tar.gz ../releases - make-patch - - which leaves your patch as ./patch-0.1.48.jcn1. - - or even simpler: - - release - - tar-ball: ../patches/patch-0.1.48.jcn1.gz - patch: ../patches/patch-0.1.48.jcn1.gz - updeet: ../test/updeet - - -PREREQUISITES - For creating a patch you need - - o All items mentioned in INSTALL. You're not going to - send a patch that you haven't even built, right? - - o GNU Diff - o Python (version 1.4 or newer). You can of course make a patch by hand, which would go something like: @@ -189,19 +83,6 @@ PREREQUISITES o The Lily directory structure, which looks like: - - - - -2/Apr/98 LilyPond 0.1.57 3 - - - - - -PATCHES(1) LilyPond documentation PATCHES(1) - - lilypond-0.1.48/ patches/ releases/ @@ -246,19 +127,6 @@ MAINTAINER - - - - - - - - - - - - - -2/Apr/98 LilyPond 0.1.57 4 +20/Apr/98 LilyPond 0.1.58 2 diff --git a/TODO b/TODO index 27e0071ae7..8a8bdbaa23 100644 --- a/TODO +++ b/TODO @@ -9,11 +9,13 @@ grep for TODO and ugh/ugr 0.2: * junk embedded mf - * shared lib + + * ly2dvi seams to eat accents as in \'el\'egant * libtoolize flowerlib + * shared lib * bf: abbrevbeam? @@ -24,6 +26,7 @@ grep for TODO and ugh/ugr * check for groff / troff/ nroff et * latex quirk? + * use kpsepath to find all TeX dirs - configure.in - clean-fonts.sh @@ -67,6 +70,21 @@ grep for TODO and ugh/ugr * stem len adjustable STUFF + * clefs: The names I'd like are of the form + + [FGC]n{[_^]8} F, G or C clef, on nth line, subscripted + or superscripted with an 8. + So: + G, G2, treble, (== current `violin') G clef on second line. + F, F4, bass (== current `bass' ) F clef on fourth line + G_8, G2_8 G clef on 2nd line, with 8 subscript + G^8 G clef on 2nd line with 8 superscript + C1, soprano (==current `soprano') C clef on first line. + C2, (==current `mezzosoprano') C clef on second line + C3, alto (==current `alto') C clef on third line + C4, tenor (==current `tenor') C clef on fourth line + C5 (==current `baritone') C clef on fifth line) + * give Items/Spanners access to unbroken originals @@ -103,6 +121,8 @@ STUFF * AFM for font input? 3RD PARTY BUGS: + * tried egcs 1.0.2: failed on lily/stem.cc -> flower/include/interval.hh + should narrow down and send bug report * xdvi: PS in magnifying glass. diff --git a/VERSION b/VERSION index e27a742c2c..6b52b51a7f 100644 --- a/VERSION +++ b/VERSION @@ -1,6 +1,6 @@ MAJOR_VERSION=0 MINOR_VERSION=1 -PATCH_LEVEL=57 +PATCH_LEVEL=58 MY_PATCH_LEVEL= # use the above to send patches, always empty for released version: diff --git a/bin/conflily.sh b/bin/conflily.sh index 2eab5a059e..dff069ab34 100755 --- a/bin/conflily.sh +++ b/bin/conflily.sh @@ -29,9 +29,7 @@ if [ "x$LILYINCLUDE" = "x" ]; then echo "export MFINPUTS=$MFINPUTS:$lelie/current/mf" fi -mkdir -p ../build -(cd ../build; -ln -sf $lelie/build/lily/lilypond bin/lilypond -ln -sf $lelie/build/mi2mu/mi2mu bin/mi2mu -../current/configure --prefix=/usr --enable-debugging --enable-printing --enable-checking) +ln -sf $lelie/current/lily/out/lilypond bin/lilypond +ln -sf $lelie/current/mi2mu/out/mi2mu bin/mi2mu +configure --prefix=/usr --enable-debugging --enable-printing --enable-checking diff --git a/configure b/configure index 1de68df503..5a09581ddb 100755 --- a/configure +++ b/configure @@ -2238,4 +2238,5 @@ test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 rm -f Makefile cp make/Toplevel.make.in ./Makefile -chmod 555 Makefile +chmod 444 Makefile + diff --git a/configure.in b/configure.in index 8a85e74b77..13bf8fd95f 100644 --- a/configure.in +++ b/configure.in @@ -266,4 +266,5 @@ AC_OUTPUT(config.make) rm -f Makefile cp make/Toplevel.make.in ./Makefile -chmod 555 Makefile +chmod 444 Makefile + diff --git a/flower/Makefile b/flower/Makefile index 914663ff37..c970266bd6 100644 --- a/flower/Makefile +++ b/flower/Makefile @@ -17,22 +17,6 @@ depth = .. # NAME = flower MODULE_NAME = flower -# -# edit VERSION only -include ./$(depth)/VERSION -include ./$(depth)/flower/VERSION - -# generic variables: -# -include ./$(depth)/make/Variables.make -include ./$(depth)/make/Files.make - -#include $(flowerout)/Flower-flags.make - - -# -# descent order into subdirectories: -# SUBDIRS = include # @@ -41,17 +25,14 @@ SUBDIRS = include SCRIPTS = README_FILES = ONEWS NEWS README TODO EXTRA_DISTFILES= VERSION $(README_FILES) $(SCRIPTS) -#Flower-flags.make.in -# aclocal.m4 configure config.hh.in configure.in - - +include ./$(depth)/VERSION +include ./$(depth)/flower/VERSION -# generic targets and rules: -# +include ./$(depth)/make/Variables.make +include ./$(depth)/make/Files.make include ./$(depth)/make/Targets.make include ./$(depth)/make/Rules.make -# default: the-lib diff --git a/flower/include/interval.hh b/flower/include/interval.hh index 7a868a31ab..2d7488aeef 100644 --- a/flower/include/interval.hh +++ b/flower/include/interval.hh @@ -26,7 +26,14 @@ struct Interval_t { static T infinity() ; static String T_to_str (T arg); - T center() { return (left + right) / T(2);} + // ugh, egcs 1.02 ices on this +// T center() { return (left + right) / T(2);} + // and can't handle this either + // anyone want to make a bug report? + T center() { + T two (2); + return (left + right) / two; + } void translate (T t) { left += t; right += t; diff --git a/flower/include/real.hh b/flower/include/real.hh index 5b5bc26f7a..3b030c4cba 100644 --- a/flower/include/real.hh +++ b/flower/include/real.hh @@ -17,7 +17,6 @@ typedef double Real; const Real infinity_f = HUGE_VAL; - template inline T abs (T x) { return x > 0 ? x : -x; diff --git a/flower/offset.cc b/flower/offset.cc index ba1fee0075..232967e675 100644 --- a/flower/offset.cc +++ b/flower/offset.cc @@ -11,6 +11,7 @@ #include "offset.hh" +#ifndef STANDALONE String Offset::str () const { @@ -18,14 +19,14 @@ Offset::str () const s = String("(") + coordinate_a_[X_AXIS] + ", " + coordinate_a_[Y_AXIS] + ")"; return s; } - +#endif Offset complex_multiply (Offset z1, Offset z2) { Offset z; z[X_AXIS] = z1[X_AXIS] * z2[X_AXIS] - z1[Y_AXIS]*z2[Y_AXIS]; - z[Y_AXIS] = z1[X_AXIS] * z2[Y_AXIS] - z1[Y_AXIS] * z2[X_AXIS]; + z[Y_AXIS] = z1[X_AXIS] * z2[Y_AXIS] + z1[Y_AXIS] * z2[X_AXIS]; return z; } diff --git a/init/Makefile b/init/Makefile index 1422d5d2aa..1e846bdbbf 100644 --- a/init/Makefile +++ b/init/Makefile @@ -1,17 +1,11 @@ # init/Makefile - -# subdir level: -# depth = .. -# # generic stuff/Makefile # include ./$(depth)/make/Include.make -# list of distribution files: -# INIFILES = $(wildcard *.ly) DISTFILES = Makefile $(INIFILES) @@ -20,11 +14,9 @@ DISTFILES = Makefile $(INIFILES) FONT_FILES = $(wildcard $(depth)/mf/*[0-9].mf) TABLES = $(patsubst $(depth)/mf/%.mf,%.ly,$(FONT_FILES)) - localclean: rm -f $(TABLES) - INSTALLATION_DIR=$(datadir)/lilypond/ INSTALLATION_FILES=$(INIFILES) diff --git a/input/clefs.ly b/input/clefs.ly new file mode 100644 index 0000000000..7722d99d1b --- /dev/null +++ b/input/clefs.ly @@ -0,0 +1,17 @@ +\score { + \melodic{ \octave c'; + \clef "violin"; c1^"{violin}" \bar "||"; + \clef "french";c1^"{french}" \bar "||"; + \clef "soprano";c1^"{soprano}" \bar "||"; + \clef "mezzosoprano";c1^"{mezzosoprano}" \bar "||"; + \clef "alto";c1^"{alto}" \bar "||"; + \clef "tenor";c1^"{tenor}" \bar "||"; + \clef "baritone";c1^"{baritone}" \bar "||"; + \clef "varbaritone";c1^"{varbaritone}" \bar "||"; + \clef "bass";c1^"{bass}" \bar "||"; + \clef "subbass";c1^"{subbass}" \bar "|."; + } + \paper{ + } +} + diff --git a/input/sleur.ly b/input/sleur.ly index 4ef5e88d91..4dc4e08f6d 100644 --- a/input/sleur.ly +++ b/input/sleur.ly @@ -21,80 +21,167 @@ dirs = \melodic { complex = \melodic{ \octave c'; - 'c16( 'e( 'g( 'b( d( f( a( c'~ )))))))c4 c4 | + 'c16( 'e( 'g( 'b( d( f( a( c'())))))))c4 c4 | \octave c'''; - 'c16( a( f( d( 'b( 'g( 'e( 'c~ )))))))c4 c4 | + 'c16( a( f( d( 'b( 'g( 'e( 'c())))))))c4 c4 | } -beum = \melodic{ +over = \melodic{ \octave c'; - [c8 c] c4 c4 c4 | -} -extend = \melodic{ - \octave c; - c8(( c c )c c c c )c | - \[4/5c8( c c' c )c\]1/1 c c c c | - \[4/5c8( c c c c'\]1/1 c c c )c | - \[4/5c8( c c c c''\]1/1 c c c )c' | - \[4/5c8( c c c c'\]1/1 c c c )'c | - \[4/5c8( c c' c c\]1/1 c c c )c | - \[4/5c8( c c c ''c\]1/1 c c c )c | - \[4/5c8( c ''c c c\]1/1 c c c )c | + e( g' g' )e + e( a' a' )e + e( b' b' )e + e( c'' c'' )e + \stemup + e( c' c' )e + e( d' d' )e + e( e' e' )e + e( c'' c'' )e + \stemboth + e( f' b' )e + e( b' f' )e + e( e'' g' )e + e( g' e'' )e + \stemup + e( d' b )e + e( b d' )e + e( f' c'' )e + e( c'' f )e } -extendbug = \melodic{ +under = \melodic{ \octave c'; - c4( c' c' )c - \stemup c'4( \stemdown e e \stemboth )c' - [c'8( b g a] [c' d' e' c'] [c' d' e' )c'] - c( c' c' )c - e( g' g' )e + \stemdown + f'( \stemboth d d \stemdown )f' + f'( \stemboth c c \stemdown )f' + f'( \stemboth 'b 'b \stemdown )f' + f'( \stemboth 'a 'a \stemdown )f' + \stemdown + f'( a a )f' + f'( g g )f' + f'( f f )f' + f'( 'a 'a )f' + \stemdown + f'( \stemboth d 'b \stemdown )f' + f'( \stemboth 'b d \stemdown )f' + f'( \stemboth 'd 'b \stemdown )f' + f'( \stemboth 'b 'd \stemdown )f' + \stemdown + f'( f a )f' + f'( a f )f' + f'( f 'e )f' + f'( 'e f )f' +} + +eccentric = \melodic{ + \octave c'; + \stemup + \[4/7 f( a' f f f f )f \] | + \[4/7 f( f f f f a' )f \] | + \stemdown + \[4/7 e'( c e' e' e' e' )e' \] | + \[4/7 e'( e' e' e' e' c )e' \] | } -blend = \melodic{ - \octave c; - \stemdown; -%% \[4/5c8( c ''c c c\]1/1 c c c )c | - \[4/5c8( c ''f c c\]1/1 c c c )c | - - \[4/5c8( c \stemup ''f \stemdown c c\]1/1 c c c )c | - \stemup; - \octave c''; - \[4/5c8( c f'' c c\]1/1 c c c )c | - \[4/5c8( c \stemdown f'' \stemup c c\]1/1 c c c )c | - \stemboth; - c4( 'c16 'e 'g 'b d f a )'c16 c4 | - c4( 'c16 'e 'g 'b d f f )'c16 c4 | +tiltup = \melodic{ \octave c'; - \stemdown; - c( c'' c'' )c - \stemboth; - e( g' g' )e - e( g' g' )e - e( g' g' )e - e( g' g' )e + e( c'' c'' )e' + \stemup + e( c'' c'' )e' + \stemboth + e( g' e'' )e' + \stemup + e( c'' f )e' + \stemdown + f'( \stemboth 'a 'a \stemdown )f'' + \stemdown + f'( 'a 'a )f'' +} + +tiltdown = \melodic{ + \octave c'; + e'( c'' c'' )e + \stemup + e'( c'' c'' )e + \stemboth + e'( g' e'' )e + \stemup + e'( c'' f )e + \stemdown + f''( \stemboth 'a 'a \stemdown )f' + \stemdown + f''( 'a 'a )f' +} + +broken = \melodic{ + \octave c''; + c c c c() + c c c c( + c )c c c( + c c )c c( + )a' a' a' a'() + a' a' a' a'() + c( c c )c + c( c c )'f + 'f( c c )c + 'f( c c )'f +} + +blend = \melodic{ + \octave c'; + e( c'' c'' )e + \stemup + e( c'' c'' )e + \stemdown + f'( \stemboth 'a 'a \stemdown )f' + f'( 'a 'a )f' + + \stemboth + e( c'' c'' )e' + e'( c'' c'' )e + d( d d )d + + \stemdown + e( c'' c'' )e' + e'( c'' c'' )e + d( d d )d +} + + +bug = \melodic{ + \octave c'; + a()g( f )e + b'()a'( g' )f' + g( f' e' )d' + f f( g )a + c' () b () c' c' } \score{ \melodic{ - \blend + % use blend for fast check + %\blend +% { \shortlong \dirs \complex - \beum - \octave c'; - \stemup; - \extend - \octave c''; - \stemdown; - \extend - \stemboth; - \extendbug + \over + \under + \eccentric + \tiltup + \tiltdown + \bug +% } + % use broken with small linewidth + %\broken } \paper{ -% castingalgorithm = \Wordwrap; + indent = 0.0\pt; + %for broken! + %linewidth= 40.\mm; + %castingalgorithm = \Wordwrap; } } diff --git a/lily/VERSION b/lily/VERSION index 0523ff52f5..bd76086098 100644 --- a/lily/VERSION +++ b/lily/VERSION @@ -1,4 +1,4 @@ MAJOR_VERSION = 0 MINOR_VERSION = 1 -PATCH_LEVEL = 57 +PATCH_LEVEL = 58 MY_PATCH_LEVEL = diff --git a/lily/beam.cc b/lily/beam.cc index 6ad3fe78c0..c3991ea3ca 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -29,7 +29,7 @@ #include "lookup.hh" #include "grouping.hh" #include "stem-info.hh" -#include "main.hh" // experimental features +//#include "main.hh" // experimental features IMPLEMENT_IS_TYPE_B1 (Beam, Spanner); @@ -450,7 +450,8 @@ Beam::set_stemlens () s->set_stemend (left_y_ + slope_f_ * x); Real y = s->stem_length_f (); // duh: - int mult_i = stems_[i]->beams_left_i_ >? stems_[i]->beams_right_i_; +// int mult_i = stems_[i]->beams_left_i_ >? stems_[i]->beams_right_i_; + int mult_i = multiple_i_; if (mult_i > 1) // dim(y) = internote y -= (Real)(mult_i - 1) * interbeam_f / internote_f; @@ -588,7 +589,5 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const Does beam quanting think of the asymetry of beams? Refpoint is on bottom of symbol. (FIXTHAT) --hwn. */ - if (experimental_features_global_b && dir_ < 0) - leftbeams.translate_axis (-beamheight_f, Y_AXIS); return leftbeams; } diff --git a/lily/bezier.cc b/lily/bezier.cc index 27b8329fc2..f261d37c28 100644 --- a/lily/bezier.cc +++ b/lily/bezier.cc @@ -8,7 +8,6 @@ #include #include "bezier.hh" -#include "direction.hh" #ifndef STANDALONE #include "direction.hh" @@ -24,7 +23,6 @@ void Curve::flipy () { - // ugh, Offset should have mirror funcs for (int i = 0; i < size (); i++) (*this)[i].mirror (Y_AXIS); } @@ -52,8 +50,7 @@ Curve::largest_disturbing () void Curve::rotate (Real phi) { - Offset rot (complex_exp (Offset (0,phi))); - + Offset rot (complex_exp (Offset (0, phi))); for (int i = 1; i < size (); i++) (*this)[i] = complex_multiply (rot, (*this)[i]); } @@ -65,16 +62,16 @@ Curve::translate (Offset o) (*this)[i] += o; } -Bezier::Bezier (int steps) +Bezier::Bezier () { control_.set_size (4); - curve_.set_size (steps); } -//from GNU gs3.33: ega.c void -Bezier::calc () +Bezier::calc (int steps) { + steps = steps >? 10; + curve_.set_size (steps); Real dt = 1.0 / curve_.size (); Offset c = 3.0 * (control_[1] - control_[0]); Offset b = 3.0 * (control_[2] - control_[1]) - c; @@ -97,50 +94,32 @@ Bezier::set (Array points) Real Bezier::y (Real x) { - if (x <= curve_[0].x ()) - return curve_[0].y (); +// if (x <= curve_[0].x ()) +// return curve_[0].y (); for (int i = 1; i < curve_.size (); i++ ) { - if (x < curve_[i].x ()) - // ^ ? see below + if (x < curve_[i].x () || (i == curve_.size () - 1)) { - Real lin = (x - curve_[i-1].x ()) / (curve_[i] - curve_[i-1]).x (); - // ^ ? - return (curve_[i-1] + lin * (curve_[i] - curve_[i-1])).y (); + Offset z1 = curve_[i-1]; + Offset z2 = curve_[i]; + Real multiplier = (x - z2.x ()) / (z1.x () - z2.x ()); + Real y = z1.y () * multiplier + (1.0 - multiplier) z2.y(); + + return y; } } - return curve_[curve_.size ()-1].y (); + assert (false); + // silly c++ + return 0; } Bezier_bow::Bezier_bow (Paper_def* paper_l) - : Bezier(10) { paper_l_ = paper_l; return_.set_size (4); } -/* - from feta-sleur.ly - - slurheightlimit#:=staffsize#/2; - sluralpha:=slurheightlimit#*pi/2; - % slurratio:=1/3; - slurratio:=0.3333; - slurbeta:=3/4*pi*slurratio/sluralpha; - - b#:=length(dx#,dy#); - % ugh: huh? 2/5 - indent#:=2/5*sluralpha*atan(slurbeta*b#); - height:=(indent+h)*d; - z1=(0,0); - z2=(b,0); - z3=(indent,height); - z4=(b-indent,height); - - boogje:=boogje rotated angle(dxs,dys); -*/ - void Bezier_bow::blow_fit () { @@ -149,13 +128,14 @@ Bezier_bow::blow_fit () return; // be careful not to take too big step - Real f = 0.75; + Real f = 0.3; Real h1 = dy1 * f; control_[1].y () += h1; control_[2].y () += h1; return_[1].y () += h1; return_[2].y () += h1; + calc_bezier (); Real dy2 = check_fit_f (); if (!dy2) return; @@ -189,9 +169,23 @@ Bezier_bow::blow_fit () Real h = -b / a; control_[1].y () += -h1 +h; - control_[2].y () = -h1 +h; - return_[1].y () = -h1 +h; - return_[2].y () = -h1 +h; + control_[2].y () += -h1 +h; + return_[1].y () += -h1 +h; + return_[2].y () += -h1 +h; +} + +void +Bezier_bow::calc_bezier () +{ + Real s = sqrt (control_[3].x () * control_[3].x () + + control_[1].y () * control_[2].y ()); +#ifndef STANDALONE + Real internote = paper_l_->internote_f (); +#else + Real internote = STAFFHEIGHT / 8; +#endif + int steps = (int)rint (s / internote); + Bezier::calc (steps); } Real @@ -199,8 +193,9 @@ Bezier_bow::calc_f (Real height) { transform (); calc_default (height); - Bezier::calc (); - + + calc_bezier (); + Real dy = check_fit_f (); calc_return (0, 0); @@ -213,7 +208,7 @@ Bezier_bow::calc () { transform (); calc_default (0); - Bezier::calc (); + calc_bezier (); if (check_fit_bo ()) calc_return (0, 0); @@ -232,28 +227,25 @@ Bezier_bow::calc_return (Real begin_alpha, Real end_alpha) #ifndef STANDALONE Real thick = 1.8 * paper_l_->rule_thickness (); #else - Real thick = 10.0 * 1.8 * 0.4 PT; + Real thick = 1.8 * 0.4 PT; #endif + return_[0] = control_[3]; + return_[3] = control_[0]; return_[1] = control_[2] - thick * complex_exp (Offset (0, 90 + end_alpha)); - return_[2] = control_[1] - thick * complex_exp (Offset (0, 90 - begin_alpha)); - - /* - return_[1].x () = control_[2].x () - thick * cos (90 + end_alpha); - return_[1].y () = control_[2].y () - thick * sin (90 + end_alpha); - return_[2].x () = control_[1].x () - thick * cos (90 - begin_alpha); - return_[2].y () = control_[1].y () - thick * sin (90 - begin_alpha); - */ - return_[3] = control_[0]; + return_[2] = control_[1] + - thick * complex_exp (Offset (0, 90 - begin_alpha)); } +/* + [TODO] + Document algorithm in: + See Documentation/fonts.tex + */ void Bezier_bow::calc_controls () { - // ugh: tooo steep -// Real default_rc = atan (control_[1].y () / control_[1].x ()); - Offset ijk_p (control_[3].x () / 2, control_[1].y ()); SLUR_DOUT << "ijk: " << ijk_p.x () << ", " << ijk_p.y () << endl; @@ -269,17 +261,16 @@ Bezier_bow::calc_controls () begin_rc = default_rc; } - // ugh Curve reversed; reversed.set_size (encompass_.size ()); Real b = control_[3].x (); for (int i = 0; i < encompass_.size (); i++ ) { - reversed[i] = Offset (b,0) - encompass_[encompass_.size () - i -1]; - /* + // b 1 0 + // r = - * c + // 0 0 -1 reversed[i].x () = b - encompass_[encompass_.size () - i - 1].x (); reversed[i].y () = encompass_[encompass_.size () - i - 1].y (); - */ } int end_disturb = reversed.largest_disturbing (); @@ -312,11 +303,16 @@ Bezier_bow::calc_controls () Real end_alpha = atan (-end_rc); Real theta = (begin_alpha - end_alpha) / 2; +#ifndef STANDALONE + Real internote = paper_l_->internote_f (); +#else + Real internote = STAFFHEIGHT / 8; +#endif + Real epsilon = internote / 5; + // if we have two disturbing points, have height line through those... - /* - UGH UGH UGH! NEVER compare floats with == - */ - if (!((begin_p.x () == end_p.x ()) && (begin_p.y () == end_p.y ()))) + if (!((abs (begin_p.x () - end_p.x ()) < epsilon) + && (abs (begin_p.y () - end_p.y ()) < epsilon))) theta = atan (end_p.y () - begin_p.y ()) / (end_p.x () - begin_p.x ()); Real rc3 = tan (theta); @@ -374,10 +370,6 @@ Bezier_bow::transform () encompass_.translate (-origin_); Offset delta = encompass_[encompass_.size () - 1] - encompass_[0]; - /* - Real dx = encompass_[encompass_.size () - 1].x () - encompass_[0].x (); - Real dy = encompass_[encompass_.size () - 1].y () - encompass_[0].y (); - */ alpha_ = delta.arg (); encompass_.rotate (-alpha_); @@ -408,6 +400,9 @@ Bezier_bow::transform_controls_back () encompass_.translate (origin_); } +/* + See Documentation/fonts.tex + */ void Bezier_bow::calc_default (Real h) { @@ -415,33 +410,26 @@ Bezier_bow::calc_default (Real h) #ifndef STANDALONE Real staffsize_f = paper_l_->get_var ("barsize"); #else - Real staffsize_f = 16 PT; + Real staffsize_f = STAFFHEIGHT; #endif Real height_limit = staffsize_f; - Real alpha = height_limit * pi / 2.0; Real ratio = 1.0/3.0; - Real beta = 3.0/4.0 * pi * ratio/alpha; - - Offset delta (encompass_[encompass_.size () - 1].x () - encompass_[0].x (), 0); - - Real d = 1; + Real alpha = height_limit * 2.0 / pi; + Real beta = pi * ratio / (2.0 * height_limit); + Offset delta (encompass_[encompass_.size () - 1].x () + - encompass_[0].x (), 0); Real b = delta.length (); - Real indent = 2.0/5.0 * alpha * atan (beta * b); - // ugh, ugly height hack, see lily-ps-defs.tex - Real height = (indent + h) * d; + Real indent = alpha * atan (beta * b); + Real height = indent + h; -// Offset control[4] = {0, 0, indent, height, b - indent, height, b, 0 }; Array control; control.push (Offset (0, 0)); control.push (Offset (indent, height)); control.push (Offset (b - indent, height)); control.push (Offset (b, 0)); Bezier::set (control); - -// Real phi = dx ? atan (dy/dx) : sign (dy) * pi / 2.0; -// control.rotate (phi); } diff --git a/lily/bow.cc b/lily/bow.cc index 9433f69a18..8be81c4f61 100644 --- a/lily/bow.cc +++ b/lily/bow.cc @@ -4,58 +4,84 @@ source file of the GNU LilyPond music typesetter (c) 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen */ #include "bow.hh" #include "paper-def.hh" #include "molecule.hh" #include "lookup.hh" +#include "bezier.hh" IMPLEMENT_IS_TYPE_B1(Bow,Directional_spanner); Bow::Bow () { - dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = 0; + dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = 0.0; dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0; } +Molecule* +Bow::brew_molecule_p () const +{ + Molecule* mol_p = new Molecule; + + Real dy_f = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT]; + + Real dx_f = width ().length (); + dx_f += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]); + + Atom a = paper ()->lookup_l ()->slur (get_controls ()); + + a.translate (Offset (dx_f + dx_f_drul_[LEFT], dy_f + dy_f_drul_[LEFT])); + mol_p->add (a); + return mol_p; +} Offset Bow::center () const { - Real dy = dy_f_drul_[RIGHT]-dy_f_drul_[LEFT]; + Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT]; - Real w = width ().length (); + Real dx = width ().length (); - return Offset (w/2,dy ); + return Offset (dx / 2, dy); } -Molecule* -Bow::brew_molecule_p () const +Interval +Bow::do_width () const { - Molecule*output = new Molecule; - Real w = width ().length (); - - Real dy_f = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT]; - - Real nw_f = paper ()->note_width (); - - w+= (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]); - Real round_w = w; // slur lookup rounds the slurwidth . - - Atom a = paper ()->lookup_l ()->slur (dy_f, round_w, height_f (), dir_); - - Real error = w-round_w; - a.translate (Offset ( (dx_f_drul_[LEFT] + 0.5*nw_f) - + error/2, - dy_f_drul_[LEFT])); - output->add (a); - return output; + Interval i = Spanner::do_width (); + Real dx = i.length(); + return Interval (0, dx); } -Real -Bow::height_f () const +Array +Bow::get_controls () const { - return 0; + Bezier_bow b (paper ()); + b.set (get_encompass_offset_arr (), dir_); + b.calc (); + Array controls; + controls.set_size (8); + for (int i = 0; i < 4; i++) + controls[i] = b.control_[i]; + for (int i = 0; i < 4; i++) + controls[i + 4] = b.return_[i]; + return controls; +} + +Array +Bow::get_encompass_offset_arr () const +{ + Real dx = width (). length (); + dx += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]); + Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT]; + + Array notes; + notes.push (Offset (0,0)); + notes.push (Offset (dx, dy)); + + return notes; } diff --git a/lily/clef-grav.cc b/lily/clef-grav.cc index 5f9a9376e7..5812e7fc5d 100644 --- a/lily/clef-grav.cc +++ b/lily/clef-grav.cc @@ -29,7 +29,7 @@ bool Clef_engraver::set_type (String s) { clef_type_str_ = s; - if (clef_type_str_ == "violin") + if (clef_type_str_ == "violin" || clef_type_str_ == "G" || clef_type_str_ == "G2") c0_position_i_= -6; else if (clef_type_str_ == "french") c0_position_i_= -8; @@ -45,12 +45,25 @@ Clef_engraver::set_type (String s) c0_position_i_ = 4; else if (clef_type_str_ == "varbaritone") c0_position_i_ = 4; - else if (clef_type_str_ == "bass") + else if (clef_type_str_ == "bass" || clef_type_str_ == "F") c0_position_i_= 6; else if (clef_type_str_ == "subbass") c0_position_i_ = 8; else + switch(clef_type_str_[0]) + { + case 'F': case 'f': + c0_position_i_ = 2 * (clef_type_str_[1] - '0') - 2; + break; + case 'G': case 'g': + c0_position_i_ = 2 * (clef_type_str_[1] - '0') - 10; + break; + case 'C': case 'c': + c0_position_i_ = 2 * (clef_type_str_[1] - '0') - 6; + break; + default: return false; + } return true; } diff --git a/lily/clef-item.cc b/lily/clef-item.cc index b3b468047f..0c5c56eb22 100644 --- a/lily/clef-item.cc +++ b/lily/clef-item.cc @@ -34,6 +34,12 @@ Clef_item::Clef_item() read ("violin"); } +/* + * Convert input clef string to + * a clef symbol and a line position. + * This would be better done in the lexer (more efficient) + * or as a table-lookup. + */ void Clef_item::read (String t) { @@ -42,42 +48,58 @@ Clef_item::read (String t) { y_position_i_ = -2; } - else if (t == "french") + else if (t == "bass") + { + y_position_i_ = 2; + } + else if (t == "G" || t == "G2" || t == "treble") + { + symbol_ = "violin"; + y_position_i_ == -2; + } + else if (t == "french" || t == "G1") { symbol_="violin"; y_position_i_ = -4; } - else if (t == "soprano") + else if (t == "soprano" || t == "C1") { symbol_="alto"; y_position_i_ = -4; } - else if (t == "mezzosoprano") + else if (t == "mezzosoprano" || t == "C2") { symbol_ = "alto"; y_position_i_ = -2; } else if (t == "alto") { + symbol_ = "alto"; y_position_i_ = 0; } - else if (t == "tenor") + else if (t == "C3") { - symbol_="alto"; + symbol_ = "alto"; + y_position_i_ = 0; + } + else if (t == "tenor" || t == "C4") + { + symbol_ = "alto"; y_position_i_ = 2; } - else if (t == "baritone") + else if (t == "baritone" || t == "C5") { symbol_ = "alto"; y_position_i_ = 4; } - else if (t == "varbaritone") + else if (t == "varbaritone" || t == "F3") { symbol_ = "bass"; y_position_i_ = 0; } - else if (t == "bass") + else if (t == "F" || t == "F4") { + symbol_ = "bass"; y_position_i_ = 2; } else if (t == "subbass") @@ -85,6 +107,21 @@ Clef_item::read (String t) symbol_ = "bass"; y_position_i_ = 4; } + else if (isdigit(t[1])) + switch (t[0]) + { // we've already dealt with plain F, G or C clef + // position 0 is line 3. + case 'G': + case 'g': + symbol_ = "violin"; + y_position_i_ = 2 * (t[1] - '0') - 6; + break; + case 'F': + case 'f': + symbol_ = "bass"; + y_position_i_ = 2 * (t[1] - '0') - 6; + break; + } } void diff --git a/lily/direction.cc b/lily/direction.cc index a0e0e14a50..802418fce5 100644 --- a/lily/direction.cc +++ b/lily/direction.cc @@ -12,14 +12,14 @@ String direction_str (Direction d, Axis a) { - if (!d) - return "center"; + String s("center"); if (a == Y_AXIS) { - return d == UP ? "up" : "down"; + s =( d == UP ? "up" : "down"); } else if (a == X_AXIS) { - return d == LEFT ? "left" : "right" ; + s = (d == LEFT ? "left" : "right" ); } + return s; } diff --git a/lily/include/bezier.hh b/lily/include/bezier.hh index f5c871ed05..d69fc98196 100644 --- a/lily/include/bezier.hh +++ b/lily/include/bezier.hh @@ -20,12 +20,12 @@ class Bezier { public: - Bezier (int steps_i); + Bezier (); /** Calculate bezier curve into Offset (x,y) array. */ - void calc (); + void calc (int steps); void set (Array points); @@ -50,8 +50,9 @@ public: Calculate bezier curve for bow from bow parameters. */ void blow_fit (); - Real calc_f (Real height); void calc (); + Real calc_f (Real height); + void calc_bezier (); void calc_controls (); void calc_default (Real h); void calc_return (Real begin_alpha, Real end_alpha); diff --git a/lily/include/bow.hh b/lily/include/bow.hh index 88f96bc429..ffa9db31a4 100644 --- a/lily/include/bow.hh +++ b/lily/include/bow.hh @@ -9,23 +9,30 @@ #ifndef BOW_HH #define BOW_HH + #include "directional-spanner.hh" +#include "curve.hh" /** Base class for anything that looks like a slur. Anybody with a better name? */ -class Bow : public Directional_spanner { -protected: - Drul_array dy_f_drul_; - Drul_array dx_f_drul_; +class Bow : public Directional_spanner +{ +public: + Bow (); + Offset center () const; + + DECLARE_MY_RUNTIME_TYPEINFO; +protected: virtual Molecule* brew_molecule_p () const; - virtual Real height_f () const; + virtual Interval do_width () const; + Array get_controls () const; + virtual Array get_encompass_offset_arr () const; -public: - Bow(); - DECLARE_MY_RUNTIME_TYPEINFO; - Offset center() const; + Drul_array dy_f_drul_; + Drul_array dx_f_drul_; }; + #endif // BOW_HH diff --git a/lily/include/lookup.hh b/lily/include/lookup.hh index 523a00b865..fa4463146e 100644 --- a/lily/include/lookup.hh +++ b/lily/include/lookup.hh @@ -52,18 +52,12 @@ struct Lookup { Atom bar (String, Real height) const; Atom dots () const; - Atom slur (Real &dy, Real &dx, Real ht, Direction dir) const; - Atom control_slur (Array controls, Real dx, Real dy) const; + Atom slur (Array controls) const; Atom plet (Real &dy, Real &dx, Direction dir) const; - Atom tex_slur (int dy, Real &dx, Direction dir) const; - Atom ps_slur (Real dy, Real dx, Real ht, Real dir) const; - Atom half_slur (int dy, Real &dx, Direction dir, int xpart) const; - Atom half_slur_middlepart (Real &dx, Direction dir) const; - Atom big_slur (int dy, Real &dx, Direction dir) const; Atom text (String style, String text, int align = 1) const; Atom script (String idx) const; Atom hairpin (Real & width, bool decresc, bool continued) const; Atom dynamic (String) const; }; -#endif +#endif // LOOKUPSYMS_HH diff --git a/lily/include/slur.hh b/lily/include/slur.hh index e3df46d0ae..07ceb99374 100644 --- a/lily/include/slur.hh +++ b/lily/include/slur.hh @@ -11,30 +11,29 @@ #include "lily-proto.hh" #include "parray.hh" #include "bow.hh" -#include "curve.hh" /** A #Bow# which tries to drape itself around the stems too. */ -class Slur : public Bow { +class Slur : public Bow +{ public: Link_array encompass_arr_; void add (Note_column*); + Slur (); + + SCORE_ELEM_CLONE(Slur); + DECLARE_MY_RUNTIME_TYPEINFO; + protected: - virtual Molecule* brew_molecule_p () const; - Array get_notes () const; - Array get_controls () const; + virtual Array get_encompass_offset_arr () const; - virtual void set_default_dir(); - virtual void do_post_processing(); + virtual void set_default_dir (); + virtual void do_post_processing (); virtual void do_add_processing (); virtual void do_pre_processing (); virtual void do_substitute_dependency (Score_elem*, Score_elem*); - virtual Real height_f () const; - - SCORE_ELEM_CLONE(Slur); - DECLARE_MY_RUNTIME_TYPEINFO; }; #endif // SLUR_HH diff --git a/lily/include/tie.hh b/lily/include/tie.hh index 30673fc9ee..a1100653ae 100644 --- a/lily/include/tie.hh +++ b/lily/include/tie.hh @@ -15,20 +15,23 @@ /** Connect two noteheads. */ -class Tie : public Bow { - virtual void do_add_processing(); - virtual void do_post_processing(); - virtual void set_default_dir(); - virtual void do_substitute_dependency (Score_elem*,Score_elem*); - +class Tie : public Bow +{ public: - bool same_pitch_b_; - Drul_array head_l_drul_; - + Tie (); void set_head (Direction, Note_head*head_l); - Tie(); DECLARE_MY_RUNTIME_TYPEINFO; SCORE_ELEM_CLONE(Tie); + + bool same_pitch_b_; + Drul_array head_l_drul_; + +protected: + virtual void do_add_processing (); + virtual void do_post_processing (); + virtual void set_default_dir(); + virtual void do_substitute_dependency (Score_elem*,Score_elem*); + Array get_controls () const; }; #endif // TIE_HH diff --git a/lily/lookup.cc b/lily/lookup.cc index 1ee100caa9..5b0054084d 100644 --- a/lily/lookup.cc +++ b/lily/lookup.cc @@ -19,6 +19,7 @@ #include "tex.hh" #include "scalar.hh" #include "paper-def.hh" +#include "string-convert.hh" #include "main.hh" Lookup::Lookup() @@ -145,6 +146,45 @@ Lookup::flag (int j, Direction d) const return (*symtables_p_)("flags")->lookup (c + String (j)); } +Atom +Lookup::slur (Array controls) const +{ + assert (postscript_global_b); + assert (controls.size () == 8); + + String ps = "\\embeddedps{\n"; + +#if 1 + for (int i = 1; i < 4; i++) + ps += String_convert::double_str (controls[i].x ()) + " " + + String_convert::double_str (controls[i].y ()) + " "; + + Real dx = controls[3].x (); + Real dy = controls[3].y (); + for (int i = 5; i < 8; i++) + ps += String_convert::double_str (controls[i].x () - dx) + " " + + String_convert::double_str (controls[i].y () - dy) + " "; +#else + // this would be nice + for (int i = 1; i < 4; i++) + ps += String_convert::double_str (controls[i].x ()) + " " + + String_convert::double_str (controls[i].y ()) + " "; + + for (int i = 5; i < 8; i++) + ps += String_convert::double_str (controls[i].x ()) + " " + + String_convert::double_str (controls[i].y ()) + " "; +#endif + + ps += " draw_slur}"; + + Atom s; + s.tex_ = ps; + + s.dim_[X_AXIS] = Interval (0, dx); + s.dim_[Y_AXIS] = Interval (0 ? dy); + return s; +} + Atom Lookup::streepje (int type) const { @@ -298,4 +338,3 @@ Lookup::vbracket (Real &y) const return bracket; } - diff --git a/lily/plet-spanner.cc b/lily/plet-spanner.cc index 6787088b0e..bb9980c263 100644 --- a/lily/plet-spanner.cc +++ b/lily/plet-spanner.cc @@ -65,7 +65,7 @@ Plet_spanner::brew_molecule_p () const Real interline_f = paper ()->interline_f (); Real numy_f = (dir_ > 0 ? 0 : -interline_f) + dir_ * interline_f / 2; Atom num (tdef_p_->get_atom (paper (), CENTER)); - num.translate (Offset (width ().length ()/ 2 + dx_f_drul_[LEFT], + num.translate (Offset (width ().length () / 1.8 + dx_f_drul_[LEFT], dy_f_drul_[LEFT] + dy_f / 2 + numy_f)); if (visibility_i_ >= 1) diff --git a/lily/slur.cc b/lily/slur.cc index fcc57eab1d..3e8cbdfe26 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -4,14 +4,16 @@ source file of the GNU LilyPond music typesetter (c) 1996, 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen */ /* - TODO: - - think about crossing stems. - Begin and end should be treated as a Script. + [TODO] + * begin and end should be treated as a Script. + * damping + * slur from notehead to stemend: c''()b'' */ + #include "slur.hh" #include "scalar.hh" #include "lookup.hh" @@ -23,9 +25,13 @@ #include "debug.hh" #include "boxes.hh" #include "bezier.hh" -#include "main.hh" -IMPLEMENT_IS_TYPE_B1(Slur,Spanner); +//IMPLEMENT_IS_TYPE_B1(Slur,Spanner); +IMPLEMENT_IS_TYPE_B1(Slur,Bow); + +Slur::Slur () +{ +} void Slur::add (Note_column*n) @@ -118,97 +124,38 @@ Slur::do_post_processing () { dx_f_drul_[d] = -d *(spanned_drul_[d]->width ().length () -0.5*nw_f); + Direction u = d; + flip(&u); + if ((extrema[u] == spanned_drul_[u]) && extrema[u]->stem_l_) + { + dy_f_drul_[d] = extrema[u]->stem_l_->height ()[dir_]; + dy_f_drul_[u] = extrema[u]->stem_l_->height ()[dir_]; + } } else if (extrema[d]->stem_l_ && !extrema[d]->stem_l_->transparent_b_) { dy_f_drul_[d] = (int)rint (extrema[d]->stem_l_->height ()[dir_]); - /* normal slur from notehead centre to notehead centre, minus gap */ - // ugh: diff between old and new slurs - if (!experimental_features_global_b) - dx_f_drul_[d] += -d * gap_f; - else - dx_f_drul_[d] += 0.5 * nw_f - d * gap_f; + dx_f_drul_[d] += 0.5 * nw_f - d * gap_f; + if (dir_ == extrema[d]->stem_l_->dir_) + { + if (dir_ == d) + dx_f_drul_[d] += 0.5 * (dir_ * d) * d * nw_f; + else + dx_f_drul_[d] += 0.25 * (dir_ * d) * d * nw_f; + } } else { - dy_f_drul_[d] = (int)rint (extrema[d]->head_positions_interval ()[dir_])* inter_f; + dy_f_drul_[d] = (int)rint (extrema[d]->head_positions_interval () + [dir_])* inter_f; } dy_f_drul_[d] += dir_ * interline_f; } while (flip(&d) != LEFT); } -Real -Slur::height_f () const -{ - Bezier_bow bow (paper ()); - Array notes = get_notes (); - bow.set (notes, dir_); - - Real height = 0; - Real dy1 = bow.calc_f (height); - if (!dy1) - return height; - - height = dy1; - bow.set (notes, dir_); - Real dy2 = bow.calc_f (height); - if (!dy2) - return height; - - if (abs (dy2 - dy1) < paper ()->rule_thickness ()) - return height; - - /* - Assume - dy = B (h) - with - B (h) = a * h + b; - - Then we get for height = h{dy=0} - */ - Real a = (dy2 - dy1) / dy1; - Real b = dy1; - height = -b / a; - - if (check_debug && !monitor->silent_b ("Slur")) - { - cout << "************" << endl; - cout << "dy1: " << dy1 << endl; - cout << "dy2: " << dy2 << endl; - cout << "a: " << a << endl; - cout << "b: " << b << endl; - cout << "h: " << height << endl; - } - - return height; -} - -Molecule* -Slur::brew_molecule_p () const -{ - if (!experimental_features_global_b) - return Bow::brew_molecule_p (); - - Molecule* mol_p = new Molecule; - - Real dy_f = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT]; - - Real dx_f = width ().length (); - dx_f += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]); - - Atom a = paper ()->lookup_l ()->control_slur (get_controls (), dx_f, dy_f); - - Real interline_f = paper ()->interline_f (); - Real gap_f = interline_f / 2; // 5; - Real nw_f = paper ()->note_width (); - a.translate (Offset (dx_f + 0.5 * nw_f + gap_f, dy_f + dy_f_drul_[LEFT])); - mol_p->add (a); - return mol_p; -} - Array -Slur::get_notes () const +Slur::get_encompass_offset_arr () const { Real interline = paper ()->interline_f (); Real notewidth = paper ()->note_width (); @@ -216,86 +163,76 @@ Slur::get_notes () const Stem* left_stem = encompass_arr_[0]->stem_l_; Real left_x = left_stem->hpos_f (); - // ugh, do bow corrections (see brew_mol) - left_x += dx_f_drul_[LEFT] + 0.5 * notewidth; + left_x += dx_f_drul_[LEFT]; - // ugh, do bow corrections (see brew_mol) Real left_y = dy_f_drul_[LEFT]; - // ugh, where does this asymmetry come from? - if (dir_ == DOWN) - left_y -= dir_ * internote; - - /* - urg, corrections for broken slurs: extra begin or end position - */ - int first = 0; - int n = encompass_arr_.size (); - if (encompass_arr_[0] != spanned_drul_[LEFT]) - { - n += 1; - first = 1; - left_x = spanned_drul_[LEFT]->width ().length (); - left_y = 0; - } - if (encompass_arr_.top () != spanned_drul_[RIGHT]) - n += 1; - - Array notes; - notes.set_size (n); Real dx = width ().length (); dx += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]); dx = dx ? 2 * interline; - + Real dy = (dy_f_drul_[RIGHT] - dy_f_drul_[LEFT]); if (abs (dy) > 1000) dy = sign (dy) * 1000; - notes[0].x () = 0; - notes[0].y () = 0; - notes[n - 1].x () = dx; - notes[n - 1].y () = dy; - for (int i = 1; i < n - 1; i++) + int first = 1; + int last = encompass_arr_.size () - 1; + if (encompass_arr_[0] != spanned_drul_[LEFT]) { - Stem* stem = encompass_arr_[i - first]->stem_l_; + first = 0; + left_x = spanned_drul_[LEFT]->width ().length (); + left_x -= 2 * notewidth; +// left_y = 0; + Stem* stem = encompass_arr_[last]->stem_l_; + left_y = stem->dir_ == dir_ ? stem->stem_end_f () + : stem->stem_begin_f () + 0.5 * dir_; + dy = 0; + } + if (encompass_arr_.top () != spanned_drul_[RIGHT]) + { + last += 1; + dy = 0; + } + + Array notes; + notes.push (Offset (0,0)); + for (int i = first; i < last; i++) + { + Stem* stem = encompass_arr_[i]->stem_l_; /* set x to middle of notehead or on exact x position of stem, according to slur direction */ - Real x = stem->hpos_f () - left_x + notewidth / 2; + Real x = stem->hpos_f (); + if (stem->dir_ != dir_) - x += notewidth / 2; + x += 0.5 * notewidth; else if (stem->dir_ == UP) - x += notewidth; + x += 1.0 * notewidth; + + x -= left_x; + Real y = stem->dir_ == dir_ ? stem->stem_end_f () - : stem->stem_begin_f () + 2.5 * dir_; + : stem->stem_begin_f () + 0.5 * dir_; /* leave a gap: slur mustn't touch head/stem */ y += 2.5 * dir_; + + // ugh: huh? + if (dir_ == DOWN) + y += 1.5 * dir_; + y *= internote; y -= left_y; - notes[i].x () = x; - notes[i].y () = y; + notes.push (Offset (x, y)); } - return notes; -} -Array -Slur::get_controls () const -{ - Bezier_bow b (paper ()); - b.set (get_notes (), dir_); - b.calc (); - Array controls; - controls.set_size (8); - for (int i = 0; i < 4; i++) - controls[i] = b.control_[i]; - for (int i = 0; i < 4; i++) - controls[i + 4] = b.return_[i]; - return controls; + notes.push (Offset (dx, dy)); + + return notes; } diff --git a/lily/staff-side.cc b/lily/staff-side.cc index 99476a6206..404283066c 100644 --- a/lily/staff-side.cc +++ b/lily/staff-side.cc @@ -69,12 +69,17 @@ Staff_side::get_position_f () const Interval v = support_height(); // ugh, dim[y] = PT over here - y = v[dir_] + 2 * dir_ * inter_f; + y = v[dir_] + 1 * dir_ * inter_f; int y_i = (int)rint (y / inter_f); // ugh: 5 -> staff_lines - if ((abs (y_i) < 5) && !(abs (y_i) % 2)) - y += (Real)dir_ * inter_f; + if (abs (y_i) < 5) + { + if (!(abs (y_i) % 2)) + y += (Real)dir_ * inter_f; + } +// else +// y = v[dir_] + 1 * dir_ * inter_f; return y; } diff --git a/lily/tex-slur.cc b/lily/tex-slur.cc deleted file mode 100644 index ab86f271fa..0000000000 --- a/lily/tex-slur.cc +++ /dev/null @@ -1,341 +0,0 @@ -/* - tex-slur.cc -- implement Lookup::*slur - - source file of the GNU LilyPond music typesetter - - (c) 1996,1997 Han-Wen Nienhuys -*/ - -#include -#include "main.hh" -#include "misc.hh" -#include "lookup.hh" -#include "molecule.hh" -#include "dimen.hh" -#include "debug.hh" -#include "paper-def.hh" -#include "string-convert.hh" -#include "main.hh" - -static char -direction_char (Direction y_sign) -{ - char c='#'; - switch (y_sign) - { - case DOWN: - c = 'd'; - break; - case CENTER: - c = 'h'; - break; - case UP: - c = 'u'; - break; - default: - assert (false); - } - return c; -} - -Atom -Lookup::half_slur_middlepart (Real &dx, Direction dir) const -{ - // todo - if (dx >= 400 PT) - { - WARN<<_("halfslur too large") <= 96 PT) - { - WARN << _("Slur half too wide.") << print_dimen (orig_dx) << _(" shrinking (ugh)\n"); - dx = 96 PT; - } - - widx = int (rint (dx/12.0)); - dx = widx*12.0; - if (widx) - widx --; - else - { - WARN << _("slur too narrow ") << print_dimen (orig_dx)<<"\n"; - } - - Atom s; - s.dim_[X_AXIS] = Interval (0, dx); - s.dim_[Y_AXIS] = Interval (min (0, dy), max (0, dy)); - - - String f = String ("\\hslurchar"); - - f+= direction_char (dir); - - int hidx = dy; - if (hidx <0) - hidx = -hidx; - hidx --; - int idx =-1; - - idx = widx * 16 + hidx; - if (xpart < 0) - idx += 128; - - assert (idx < 256); - f+=String ("{") + String (idx) + "}"; - - s.tex_ = f; - - return s; -} - -Atom -Lookup::ps_slur (Real dy , Real dx, Real ht, Real dir) const -{ - String ps = "\\embeddedps{\n"; - - ps += String_convert::double_str (dx) + " " - + String_convert::double_str (dy) + " " - + String_convert::double_str (ht) + " " - + String_convert::double_str (dir) + - " draw_slur}"; - - /* - slurs are rarely wider than 100pt: - precision of 3 yields maximum (slur spanning page) - error of: 1%% * 6*72pt === 0.4pt = 0.14 mm - */ - String dx_str = String_convert::precision_str (dx, 4); - String dy_str = String_convert::precision_str (dy, 3); - String ht_str = String_convert::precision_str (ht, 3); - String dir_str = String_convert::int_str ((int)dir); - String name = "feta-sleur-" + dx_str + "-" + dy_str + "-" + ht_str + "-" + dir_str; - int i = name.index_i ('.'); - while (i != -1) - { - *(name.ch_l () + i) = 'x'; - i = name.index_i ('.'); - } - - String mf = "\\embeddedmf{" + name + "}{\n"; - mf += "mode_setup;\n"; - mf += "staffsize\\#:=" - + String_convert::int_str ((int)paper_l_->get_var ("barsize"), "%d") - + "pt\\#;\n"; - mf += "interline#:=staffsize#/4;\n"; - mf += "stafflinethickness#:=0.1interline#;\n"; - mf += "input feta-sleur;\n"; - mf += "slurchar(" + dx_str + "," + dy_str + "," + ht_str + "," + dir_str + ");\n"; - mf += "end.\n"; - mf += "}\n"; - - Atom s; - s.tex_ = ps; - if (embedded_mf_global_b) - s.tex_ += mf; - return s; -} - -Atom -Lookup::tex_slur (int dy , Real &dx, Direction dir) const -{ - assert (abs ((int)dir) <= 1); - Atom s; - Direction y_sign = (Direction) sign (dy); - - bool large = abs (dy) > 8; - - if (y_sign) - { - large |= dx>= 4*16 PT; - } - else - large |= dx>= 4*54 PT; - - if (large) - { - s = big_slur (dy, dx, dir); - return s; - } - Real orig_dx = dx; - int widx = int (floor (dx/4.0)); // slurs better too small.. - dx = 4.0 * widx; - if (widx) - widx --; - else - { - WARN << _("slur too narrow: ") << print_dimen (orig_dx) << "\n"; - } - - int hidx = dy; - if (hidx <0) - hidx = -hidx; - hidx --; - if (hidx > 8) - { - WARN<<_("slur to steep: ") << dy << _(" shrinking (ugh)\n"); - } - - String f = String ("\\slurchar") + String (direction_char (y_sign)); - - int idx=-1; - if (y_sign) - { - idx = hidx * 16 + widx; - if (dir < 0) - idx += 128; - } - else - { - if (dx >= 4*54 PT) - { - WARN << _("slur too wide: ") << print_dimen (dx) << - _(" shrinking (ugh)\n"); - dx = 4*54 PT; - } - idx = widx; - if (dir < 0) - idx += 54; - } - - assert (idx < 256); - f+=String ("{") + String (idx) + "}"; - s.tex_ = f; - s.translate_axis (dx/2, X_AXIS); - return s; -} - -Atom -Lookup::big_slur (int dy , Real &dx, Direction dir) const -{ - if (dx < 24 PT) - { - warning (_("big_slur too small ") + print_dimen (dx) + _(" (stretching)")); - dx = 24 PT; - } - - Real slur_extra =abs (dy) /2.0 + 2; - int l_dy = int (Real (dy)/2 + slur_extra*dir); - int r_dy = dy - l_dy; - - Real internote_f = paper_l_->internote_f(); - Real left_wid = dx/4.0; - Real right_wid = left_wid; - - Atom l = half_slur (l_dy, left_wid, dir, -1); - - - Atom r = half_slur (r_dy, right_wid, dir, 1); - Real mid_wid = dx - left_wid - right_wid; - - Molecule mol; - mol.add (l); - Atom a (half_slur (0, mid_wid, dir, 0)); - mol.add_at_edge (X_AXIS, RIGHT, a); - mol.add_at_edge (X_AXIS, RIGHT, r); - - mol.translate_axis (l_dy * internote_f, Y_AXIS); - Atom s; - s.tex_ = mol.TeX_string(); - s.dim_ = mol.extent(); - return s; -} - - -Atom -Lookup::slur (Real &dy_f , Real &dx, Real ht, Direction dir) const -{ - if (dx < 0) - { - warning (_("Negative slur/tie length: ") + print_dimen (dx)); - dx = 4.0 PT; - } - Atom s; - - if (postscript_global_b) - s = ps_slur (dy_f, dx, ht, dir); - else - { - Real nh = paper_l_->internote_f (); - int dy_i = (int) rint(dy_f / nh); - - s = tex_slur (dy_i, dx, dir); - dy_f = dy_i * nh; - } - - s.dim_[X_AXIS] = Interval (0, dx); - s.dim_[Y_AXIS] = Interval (0 ? dy_f); - return s; -} - -Atom -Lookup::control_slur (Array controls, Real dx, Real dy) const -{ - assert (postscript_global_b); - assert (controls.size () == 8); - - String ps = "\\embeddedps{\n"; - - for (int i = 1; i < 4; i++) - ps += String_convert::double_str (controls[i].x ()) + " " - + String_convert::double_str (controls[i].y ()) + " "; - - for (int i = 5; i < 8; i++) -// ps += String_convert::double_str (controls[i].x () + controls[0].x () - controls[3].x ()) + " " -// + String_convert::double_str (controls[i].y () - controls[0].y () + controls[3].y ()) + " "; - ps += String_convert::double_str (controls[i].x () - dx) + " " - + String_convert::double_str (controls[i].y () - dy) + " "; - - ps += " draw_control_slur}"; - - Atom s; - s.tex_ = ps; - - s.dim_[X_AXIS] = Interval (0, dx); - s.dim_[Y_AXIS] = Interval (0 ? dy); - return s; -} - diff --git a/lily/tie.cc b/lily/tie.cc index de7b328b11..799bebaaab 100644 --- a/lily/tie.cc +++ b/lily/tie.cc @@ -12,6 +12,7 @@ #include "p-col.hh" #include "debug.hh" +IMPLEMENT_IS_TYPE_B1(Tie,Bow); void Tie::set_head (Direction d, Note_head * head_l) @@ -93,7 +94,9 @@ Tie::do_post_processing() if (head_l_drul_[d] && head_l_drul_[d]->extremal_i_) { /* normal tie between noteheads, with gap of space */ - dx_f_drul_[d] += -d * (0.5 * nw_f + gap_f); + if (d == LEFT) + dx_f_drul_[d] += nw_f; + dx_f_drul_[d] += -d * gap_f; /* attach to outer 3/4 end of head */ dy_f_drul_[d] += dir_ * 0.25 * interline_f; } @@ -121,4 +124,3 @@ Tie::do_substitute_dependency (Score_elem*o, Score_elem*n) head_l_drul_[RIGHT] = new_l; } -IMPLEMENT_IS_TYPE_B1(Tie,Bow); diff --git a/make/Configure_variables.make.in b/make/Configure_variables.make.in deleted file mode 100644 index b6b2fa7b28..0000000000 --- a/make/Configure_variables.make.in +++ /dev/null @@ -1,40 +0,0 @@ -# -*-Makefile-*- - -# @configure_input@ - -INSTALL = @INSTALL@ -USER_CXXFLAGS = @CXXFLAGS@ @CPPFLAGS@ -USER_LDFLAGS = - -CXX = @CXX@ -POD2HTML= @POD2HTML@ -POD2MAN = @POD2MAN@ -ICFLAGS = @ICFLAGS@ -ILDFLAGS = @ILDFLAGS@ -libdir = @libdir@ -prefix = @prefix@ -TEXPREFIX = @TEXPREFIX@ -TEXDIR = @TEXDIR@ -TAR= @TAR@ -MFDIR = @MFDIR@ -mandir = @mandir@ -exec_prefix = @exec_prefix@ -bindir = @bindir@ -includedir = @includedir@ -datadir = @datadir@ -EXTRA_LIBES = @EXTRA_LIBES@ -RANLIB = @RANLIB@ -DEFS = @DEFS@ -#SET_MAKE = @SET_MAKE@ -DEFINES = @DEFINES@ -FIND = @FIND@ -COMPILEINFO = @COMPILEINFO@ -BISON = @BISON@ -FLEX = @FLEX@ -LN = @LN@ -ZIP = @ZIP@ -PERL = @PERL@ -PYTHON = @PYTHON@ -OUTDIR_NAME = @OUTDIR_NAME@ - - diff --git a/make/Makefile b/make/Makefile index 98f9b9d90f..52b9e55637 100644 --- a/make/Makefile +++ b/make/Makefile @@ -18,25 +18,23 @@ depth = .. NAME = make SUBDIRS = -# list of distribution files: - # two outdir files are distributed, since they make sense to have without running # configure and make. IN_FILES = $(wildcard *.in) -EXTRA_DISTFILES = $(IN_FILES) $(outdir)/lilypond.spec $(outdir)/lilypond.lsm $(outdir)/lelievijver.lsm +EXTRA_DISTFILES = $(IN_FILES) +OUT_DISTFILES=$(outdir)/lilypond.spec $(outdir)/lilypond.lsm $(outdir)/lelievijver.lsm # # generic variables: # include ./$(depth)/make/Variables.make include ./$(depth)/make/Files.make -# - -# generic targets and rules: -# include ./$(depth)/make/Targets.make include ./$(depth)/make/Rules.make -# + + +local-maintainerclean: + rm lilypond.spec $(wildcard *.lsm) spec: $(outdir)/lilypond.spec @@ -59,3 +57,4 @@ $(outdir)/lilypond.spec: lilypond.spec.in $(depth)/VERSION $(outdir)/%.lsm: %.lsm.in $(depth)/VERSION cat $< | $(sed-version) | $(sed-date) > $@ + diff --git a/make/Targets.make b/make/Targets.make index c65d9f8619..0d4c0b505d 100644 --- a/make/Targets.make +++ b/make/Targets.make @@ -13,20 +13,7 @@ # target all: # all: default -ifdef SUBDIRS - set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i all; done -endif - -# - -# platform specific variables, -# -#include ./$(depth)/make/out/Site.make -# - -# where to do this ? -.PRECIOUS: $(makeout)/Site.make - + $(LOOP) # dependency list of executable: # @@ -58,25 +45,27 @@ lib: $(LIBRARY) make-all-outdirs: make-outdir - set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i make-all-outdirs; done + $(LOOP) make-outdir: -mkdir $(OUTDIR_NAME) # be careful about deletion. clean: localclean - rm -f $(outdir)/* + -rm -f $(outdir)/* touch $(outdir)/dummy.dep -ifdef SUBDIRS - set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i clean; done -endif + $(LOOP) + +distclean: clean + $(LOOP) + $(MAKE) local-distclean + +maintainerclean: + $(LOOP) + $(MAKE) local-maintainerclean + $(MAKE) local-distclean -distclean: subdir-distclean local-distclean -subdir-distclean: -ifdef SUBDIRS - set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i clean; done -endif # configure: # @@ -154,12 +143,11 @@ doosdist: rm -rf $(distdir)/ -localdist: $(DISTFILES) - if [ -d out ]; then \ - mkdir $(distdir)/$(localdir)/out; \ - touch $(distdir)/$(localdir)/out/dummy.dep; \ - fi +localdist: $(DISTFILES) $(OUT_DISTFILES) + touch $(outdir)/dummy.dep; \ + mkdir $(distdir)/$(localdir)/out; \ $(LN) $(DISTFILES) $(distdir)/$(localdir) + $(LN) $(outdir)/dummy.dep $(OUT_DISTFILES) $(distdir)/$(localdir)/out ifdef SUBDIRS set -e; for i in $(SUBDIRS); do mkdir $(distdir)/$(localdir)/$$i; \ $(MAKE) localdir=$(localdir)/$$i -C $$i localdist; done @@ -171,9 +159,7 @@ ifdef all-tag-sources -etags -CT $(all-tag-sources) $(ERROR_LOG) -ctags -CT $(all-tag-sources) $(ERROR_LOG) endif -ifdef SUBDIRS - set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i TAGS ; done -endif + $(LOOP) # version stuff: @@ -192,20 +178,18 @@ localclean: local-distclean: +local-maintainerclean: + install-strip: $(MAKE) INSTALL="$(INSTALL) -s" install install: localinstall -ifdef SUBDIRS - set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i install; done -endif + $(LOOP) localinstall: uninstall: localuninstall -ifdef SUBDIRS - set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i uninstall; done -endif + $(LOOP) localuninstall: diff --git a/make/Template.make b/make/Template.make index 501aeab9df..9da75f9071 100644 --- a/make/Template.make +++ b/make/Template.make @@ -51,17 +51,16 @@ LOADLIBES += # main target of this module: # -# MAINTARGET = $(EXECUTABLE) -# MAINTARGET = $(LIBRARY) -MAINTARGET = - -default: $(MAINTARGET) +default: $(EXECUTABLE) +# default: $(LIBRARY) +include ./$(depth)/make/Files.make +include ./$(depth)/make/Targets.make +include ./$(depth)/make/Rules.make # -# generic targets and rules: -# include ./$(depth)/make/Targets.make include ./$(depth)/make/Rules.make -# +EXECUTABLES= +# include $(depth)/make/Executable.make diff --git a/make/Toplevel.make.in b/make/Toplevel.make.in index c058487bcb..f376ebc313 100644 --- a/make/Toplevel.make.in +++ b/make/Toplevel.make.in @@ -17,7 +17,7 @@ depth = . # NAME = lilypond SUBDIRS = bin flower lib lily mf mi2mu debian\ - Documentation init input tex make mutopia + Documentation init input tex make mutopia test include VERSION # @@ -32,9 +32,6 @@ README_FILES = BUGS DEDICATION ANNOUNCE-0.1 ANNOUNCE \ INSTALL.txt AUTHORS.txt PATCHES.txt EXTRA_DISTFILES = config.make.in config.hh.in .dstreamrc mudela-mode.el VERSION $(README_FILES) $(SCRIPTS) -# do not dist ./Makefile (is copied from make/Toplevel.make) -DISTFILES:=$(EXTRA_DISTFILES) -# # generic targets and rules: @@ -44,11 +41,22 @@ include ./$(depth)/make/Variables.make include ./$(depth)/make/Targets.make include ./$(depth)/make/Rules.make +# +# override Variables.make: +# do not dist ./Makefile (is copied from make/Toplevel.make) +# +DISTFILES := $(EXTRA_DISTFILES) + + + localdist: configure local-distclean: rm -f config.hh config.make Makefile config.cache config.status config.log +local-maintainerclean: + rm -f configure + Makefile: make/Toplevel.make.in chmod +w $@ echo '# WARNING WARNING WARNING WARNING' > $@ diff --git a/make/Variables.make b/make/Variables.make index b6c04face1..2918aa5a33 100644 --- a/make/Variables.make +++ b/make/Variables.make @@ -226,4 +226,8 @@ endif # substitute $(STRIP) in Site.make if you want stripping DO_STRIP=true - +ifdef SUBDIRS +LOOP=set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i $@; done +else +LOOP= +endif diff --git a/make/header-directory.make b/make/header-directory.make deleted file mode 100644 index 9017ad8327..0000000000 --- a/make/header-directory.make +++ /dev/null @@ -1,4 +0,0 @@ -# identify module: -# -include ./$(depth)/make/Include.make - diff --git a/make/lelievijver.lsm b/make/lelievijver.lsm deleted file mode 100644 index 067c6612b1..0000000000 --- a/make/lelievijver.lsm +++ /dev/null @@ -1,23 +0,0 @@ -Begin3 -Titel: LilyPond -Versie: 0.1.57 -Inschrijf datum: 19APR98 -Beschrijving: LilyPond is de muziek typesetter van het GNU Project. - Het programma genereert muziek in zichtbare of - hoorbare vorm uit uit een muzikale definitie file: - voor bladmuziek wordt typeset informatie naar een - TeX file geschreven, voor een (mechanische) uitvoering - wordt een MIDI file geschreven. Enkele kunstjes zijn - verscheidene notenbalken, maatsoorten, sleutels, - toonsoorten, teksten, krachtige invoer taal, cadensen, - balken, boogjes, triolen. -Trefwoorden: muziek typezetten midi notatie -Auteur: hanwen@stack.nl (Han-Wen Nienhuys) - jan@digicash.com (Jan Nieuwenhuizen) -Onderhouden door: hanwen@stack.nl (Han-Wen Nienhuys) -Voornaamste plek: sunsite.unc.edu /pub/Linux/apps - 395k lilypond-0.1.57.tar.gz -Oorspronkelijke plek: pcnov095.win.tue.nl /pub/lilypond/ - 395k lilypond-0.1.57.tar.gz -Copi"eer politie: GPL -End diff --git a/make/lilypond.lsm b/make/lilypond.lsm deleted file mode 100644 index 43f26e11cb..0000000000 --- a/make/lilypond.lsm +++ /dev/null @@ -1,22 +0,0 @@ -Begin3 -Title: LilyPond -Version: 0.1.57 -Entered-date: 19APR98 -Description: LilyPond is the GNU Project music typesetter. The program - generates visual or auditive output from a music - definition file: it can typeset formatted sheet music - to a TeX file and play (mechanical) performances to a - MIDI file. Features include multiple staffs, meters, - clefs, keys, lyrics, versatile input-language, - cadenzas, beams, slurs, triplets. - It includes a nice font of musical symbols. -Keywords: music notation typesetting midi fonts -Author: hanwen@stack.nl (Han-Wen Nienhuys) - jan@digicash.com (Jan Nieuwenhuizen) -Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys) -Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert - 470k lilypond-0.1.57.tar.gz -Original-site: pcnov095.win.tue.nl /pub/lilypond/development/ - 470k lilypond-0.1.57.tar.gz -Copying-policy: GPL -End diff --git a/make/lilypond.lsm.in b/make/lilypond.lsm.in index 603ef5272d..995cbd5d65 100644 --- a/make/lilypond.lsm.in +++ b/make/lilypond.lsm.in @@ -10,13 +10,13 @@ Description: LilyPond is the GNU Project music typesetter. The program clefs, keys, lyrics, versatile input-language, cadenzas, beams, slurs, triplets. It includes a nice font of musical symbols. -Keywords: music notation typesetting midi fonts -Author: hanwen@stack.nl (Han-Wen Nienhuys) +Keywords: music notation typesetting midi fonts engraving +Author: hanwen@cs.ruu.nl (Han-Wen Nienhuys) jan@digicash.com (Jan Nieuwenhuizen) Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys) Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert - 470k lilypond-@TOPLEVEL_VERSION@.tar.gz + 570k lilypond-@TOPLEVEL_VERSION@.tar.gz Original-site: pcnov095.win.tue.nl /pub/lilypond/development/ - 470k lilypond-@TOPLEVEL_VERSION@.tar.gz + 570k lilypond-@TOPLEVEL_VERSION@.tar.gz Copying-policy: GPL End diff --git a/make/lilypond.spec b/make/lilypond.spec deleted file mode 100644 index 17a85ac5fc..0000000000 --- a/make/lilypond.spec +++ /dev/null @@ -1,53 +0,0 @@ -Name: lilypond -Version: 0.1.57 -Release: 1 -Copyright: GPL -Group: Applications/Publishing -Source0: alpha.gnu.org:/gnu/lilypond/development/lilypond-0.1.57.tar.gz -Summary: A program for typesetting music. -URL: http://www.stack.nl/~hanwen/lilypond -Packager: Han-Wen Nienhuys -Icon: lelie_icon.gif -Buildroot: /tmp/lilypond-install - -%description -LilyPond is the GNU Project music typesetter. The program -generates visual or auditive output from a music -definition file: it can typeset formatted sheet music -to a TeX file and play (mechanical) performances to a -MIDI file. Features include multiple staffs, meters, -clefs, keys, lyrics, versatile input-language, -cadenzas, beams, slurs, triplets. -It includes a nice font of musical symbols. - -%prep -%setup -%build -./configure --disable-checking --disable-debugging --enable-printing --prefix=/usr --enable-optimise --enable-shared -make all -%install -rm -rf $RPM_BUILD_ROOT -strip lily/out/lilypond mi2mu/out/mi2mu -make -C Documentation gifs -make prefix="$RPM_BUILD_ROOT/usr" install -%files -%doc Documentation/out/AUTHORS.txt Documentation/out/CodingStyle.txt Documentation/out/INSTALL.txt Documentation/out/MANIFESTO.txt Documentation/out/PATCHES.txt Documentation/out/convert-mudela.txt Documentation/out/faq.txt Documentation/out/gnu-music.txt Documentation/out/index.txt Documentation/out/internals.txt Documentation/out/language.txt Documentation/out/lilypond.txt Documentation/out/links.txt Documentation/out/literature.txt Documentation/out/ly2dvi.txt Documentation/out/mi2mu.txt Documentation/out/mudela-book.txt Documentation/out/mutopia.txt Documentation/out/other-packages.txt BUGS TODO NEWS DEDICATION ANNOUNCE README -%doc input/abbrev.ly input/beam-bug.ly input/beams.ly input/cadenza.ly input/collisions.ly input/coriolan-alto.ly input/denneboom.ly input/dummy.tex input/font-body.ly input/font.ly input/font11.ly input/font13.ly input/font16.ly input/font20.ly input/font26.ly input/gourlay.ly input/keys.ly input/kortjakje.ly input/multi.ly input/pedal.ly input/praeludium-fuga-E.ly input/rhythm.ly input/scales.ly input/scripts.ly input/sleur.ly input/slur-bug.ly input/slurs.ly input/spacing.ly input/stem.ly input/test-lyrics.ly input/tril.ly input/twinkle-pop.ly input/twinkle.ly Documentation/mudela-man.doc Documentation/mudela.doc -%doc Documentation/out/lelie_logo.gif -/usr/bin/convert-mudela -/usr/bin/mudela-book -/usr/bin/lilypond -/usr/lib/libflower.so -/usr/bin/mi2mu -/usr/man/man1/mi2mu.1 -/usr/man/man1/lilypond.1 -/usr/man/man1/mudela-book.1 -/usr/man/man1/convert-mudela.1 -/usr/lib/texmf/texmf/tex/lilypond/ -/usr/lib/texmf/texmf/fonts/source/public/lilypond -/usr/share/lilypond/ -%post - -texhash # takes some time... -rm `find /var/lib/texmf -name 'feta*pk' -or -name 'feta*tfm'` - diff --git a/make/lilypond.spec.in b/make/lilypond.spec.in index 1597e7794c..96adf5b0bd 100644 --- a/make/lilypond.spec.in +++ b/make/lilypond.spec.in @@ -5,7 +5,7 @@ Copyright: GPL Group: Applications/Publishing Source0: alpha.gnu.org:/gnu/lilypond/development/lilypond-@TOPLEVEL_VERSION@.tar.gz Summary: A program for typesetting music. -URL: http://www.stack.nl/~hanwen/lilypond +URL: http://www.cs.ruu.nl/~hanwen/lilypond Packager: Han-Wen Nienhuys Icon: lelie_icon.gif Buildroot: /tmp/lilypond-install diff --git a/make/out/lelievijver.lsm b/make/out/lelievijver.lsm new file mode 100644 index 0000000000..ac0f588999 --- /dev/null +++ b/make/out/lelievijver.lsm @@ -0,0 +1,23 @@ +Begin3 +Titel: LilyPond +Versie: 0.1.58 +Inschrijf datum: 21APR98 +Beschrijving: LilyPond is de muziek typesetter van het GNU Project. + Het programma genereert muziek in zichtbare of + hoorbare vorm uit uit een muzikale definitie file: + voor bladmuziek wordt typeset informatie naar een + TeX file geschreven, voor een (mechanische) uitvoering + wordt een MIDI file geschreven. Enkele kunstjes zijn + verscheidene notenbalken, maatsoorten, sleutels, + toonsoorten, teksten, krachtige invoer taal, cadensen, + balken, boogjes, triolen. +Trefwoorden: muziek typezetten midi notatie +Auteur: hanwen@stack.nl (Han-Wen Nienhuys) + jan@digicash.com (Jan Nieuwenhuizen) +Onderhouden door: hanwen@stack.nl (Han-Wen Nienhuys) +Voornaamste plek: sunsite.unc.edu /pub/Linux/apps + 395k lilypond-0.1.58.tar.gz +Oorspronkelijke plek: pcnov095.win.tue.nl /pub/lilypond/ + 395k lilypond-0.1.58.tar.gz +Copi"eer politie: GPL +End diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm new file mode 100644 index 0000000000..2de07e43b9 --- /dev/null +++ b/make/out/lilypond.lsm @@ -0,0 +1,22 @@ +Begin3 +Title: LilyPond +Version: 0.1.58 +Entered-date: 21APR98 +Description: LilyPond is the GNU Project music typesetter. The program + generates visual or auditive output from a music + definition file: it can typeset formatted sheet music + to a TeX file and play (mechanical) performances to a + MIDI file. Features include multiple staffs, meters, + clefs, keys, lyrics, versatile input-language, + cadenzas, beams, slurs, triplets. + It includes a nice font of musical symbols. +Keywords: music notation typesetting midi fonts engraving +Author: hanwen@cs.ruu.nl (Han-Wen Nienhuys) + jan@digicash.com (Jan Nieuwenhuizen) +Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys) +Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert + 570k lilypond-0.1.58.tar.gz +Original-site: pcnov095.win.tue.nl /pub/lilypond/development/ + 570k lilypond-0.1.58.tar.gz +Copying-policy: GPL +End diff --git a/make/out/lilypond.spec b/make/out/lilypond.spec new file mode 100644 index 0000000000..aec37efd48 --- /dev/null +++ b/make/out/lilypond.spec @@ -0,0 +1,53 @@ +Name: lilypond +Version: 0.1.58 +Release: 1 +Copyright: GPL +Group: Applications/Publishing +Source0: alpha.gnu.org:/gnu/lilypond/development/lilypond-0.1.58.tar.gz +Summary: A program for typesetting music. +URL: http://www.cs.ruu.nl/~hanwen/lilypond +Packager: Han-Wen Nienhuys +Icon: lelie_icon.gif +Buildroot: /tmp/lilypond-install + +%description +LilyPond is the GNU Project music typesetter. The program +generates visual or auditive output from a music +definition file: it can typeset formatted sheet music +to a TeX file and play (mechanical) performances to a +MIDI file. Features include multiple staffs, meters, +clefs, keys, lyrics, versatile input-language, +cadenzas, beams, slurs, triplets. +It includes a nice font of musical symbols. + +%prep +%setup +%build +./configure --disable-checking --disable-debugging --enable-printing --prefix=/usr --enable-optimise --enable-shared +make all +%install +rm -rf $RPM_BUILD_ROOT +strip lily/out/lilypond mi2mu/out/mi2mu +make -C Documentation gifs +make prefix="$RPM_BUILD_ROOT/usr" install +%files +%doc Documentation/out/AUTHORS.txt Documentation/out/CodingStyle.txt Documentation/out/INSTALL.txt Documentation/out/MANIFESTO.txt Documentation/out/PATCHES.txt Documentation/out/convert-mudela.txt Documentation/out/faq.txt Documentation/out/gnu-music.txt Documentation/out/index.txt Documentation/out/internals.txt Documentation/out/language.txt Documentation/out/lilypond.txt Documentation/out/links.txt Documentation/out/literature.txt Documentation/out/ly2dvi.txt Documentation/out/mi2mu.txt Documentation/out/mudela-book.txt Documentation/out/mutopia.txt Documentation/out/other-packages.txt BUGS TODO NEWS DEDICATION ANNOUNCE README +%doc input/abbrev.ly input/beam-bug.ly input/beams.ly input/cadenza.ly input/clefs.ly input/collisions.ly input/coriolan-alto.ly input/denneboom.ly input/dummy.tex input/font-body.ly input/font.ly input/font11.ly input/font13.ly input/font16.ly input/font20.ly input/font26.ly input/gourlay.ly input/keys.ly input/kortjakje.ly input/multi.ly input/pedal.ly input/praeludium-fuga-E.ly input/rhythm.ly input/scales.ly input/scripts.ly input/sleur.ly input/slur-bug.ly input/slurs.ly input/spacing.ly input/stem.ly input/test-lyrics.ly input/tril.ly input/twinkle-pop.ly input/twinkle.ly Documentation/mudela-man.doc Documentation/mudela.doc +%doc Documentation/out/lelie_logo.gif +/usr/bin/convert-mudela +/usr/bin/mudela-book +/usr/bin/lilypond +/usr/lib/libflower.so +/usr/bin/mi2mu +/usr/man/man1/mi2mu.1 +/usr/man/man1/lilypond.1 +/usr/man/man1/mudela-book.1 +/usr/man/man1/convert-mudela.1 +/usr/lib/texmf/texmf/tex/lilypond/ +/usr/lib/texmf/texmf/fonts/source/public/lilypond +/usr/share/lilypond/ +%post + +texhash # takes some time... +rm `find /var/lib/texmf -name 'feta*pk' -or -name 'feta*tfm'` + diff --git a/mf/feta-beams16.mf b/mf/feta-beams16.mf deleted file mode 100644 index 27968efe98..0000000000 --- a/mf/feta-beams16.mf +++ /dev/null @@ -1,11 +0,0 @@ -% vette-beams16.mf -% part of LilyPond's pretty-but-neat music font - -font_identifier:="vette-beams16"; -font_size 16; -mode_setup; - -staffsize#:=16pt#; -input feta-watzieik; -end. - diff --git a/mf/feta-beams20.mf b/mf/feta-beams20.mf deleted file mode 100644 index 0340e3e057..0000000000 --- a/mf/feta-beams20.mf +++ /dev/null @@ -1,14 +0,0 @@ -% (this was vette-beams16.mf) -% part of LilyPond's pretty-but-neat music font - -% -% - -font_identifier:="feta-beams20"; -font_size 20; -mode_setup; - -staffsize#:=20pt#; - -input feta-watzieik; -end. diff --git a/mf/feta-beams26.mf b/mf/feta-beams26.mf deleted file mode 100644 index 4cb1defc32..0000000000 --- a/mf/feta-beams26.mf +++ /dev/null @@ -1,14 +0,0 @@ -% (this was vette-beams16.mf) -% part of LilyPond's pretty-but-neat music font - -% -% - -font_identifier:="feta-beams26"; -font_size 26; -mode_setup; - -staffsize#:=26pt#; - -input feta-watzieik; -end. diff --git a/mf/feta-sleur.mf b/mf/feta-sleur.mf index a1385857af..24637e273d 100644 --- a/mf/feta-sleur.mf +++ b/mf/feta-sleur.mf @@ -6,6 +6,7 @@ % (c) 1997 Jan Nieuwenhuizen % & Han-Wen Nienhuys % +% see Documentation/fonts.tex % mode_setup; @@ -19,34 +20,17 @@ def atan(expr x) = (angle(1,x)*pi/180) enddef; -%breapth, width, depth, height - -% urgh -% having mf would be nice if only from a "use the source" point of view. -% -% getslurcontrol: -% slurhtlimit 90 div /slur_alpha exch def -% slurratio 60 div slur_alpha div /slur_beta exch def -% slur_beta mul 1 atan slur_alpha mul -% -% draw_slur: -% slur_b getslurcontrol -% slur_dir mul /slur_ht exch def -% slur_b getslurcontrol /slur_indent exch def -% sleur_pen#:=stafflinethickness#; slurheightlimit#:=staffsize#/2; -% staffrulethickness 1.5 mul /slur_thick exch def -slurthick#:=3/2stafflinethickness#; +slurthick#:=1.8stafflinethickness#; define_pixels(staffsize,interline,stafflinethickness); define_pixels(sleur_pen,slurheightlimit,slurthick); -sluralpha:=slurheightlimit#*pi/2; -% slurratio:=1/3; -slurratio:=0.3333; -slurbeta:=3/4*pi*slurratio/sluralpha; +sluralpha:=2slurheightlimit#/pi; +slurratio:=1/3; +slurbeta:=pi*slurratio/2slurheightlimit#; def draw_slur(expr dxs,dys,hs,d) = save x, y; @@ -56,8 +40,7 @@ def draw_slur(expr dxs,dys,hs,d) = h#:=hs*1pt#; define_pixels(dx,dy); b#:=length(dx#,dy#); - % ugh: huh? 2/5 - indent#:=2/5*sluralpha*atan(slurbeta*b#); + indent#:=sluralpha*atan(slurbeta*b#); define_pixels(b,h,indent); height:=(indent+h)*d; z1=(0,0); diff --git a/mf/feta-watzieik.mf b/mf/feta-watzieik.mf deleted file mode 100644 index a3676cc41c..0000000000 --- a/mf/feta-watzieik.mf +++ /dev/null @@ -1,30 +0,0 @@ -% wat-zie-ik.mf -% part of LilyPond's pretty-but-neat music font -% beams: plat en steil - -input feta-params; - -beamheight#:=0.48interline#; - -define_pixels(beamheight); - -pen beam_pen; -beam_pen:=penrazor scaled beamheight rotated 90; - -max_slope:=0.6; -slopes:=20; -elem_tan:=max_slope/slopes; -lengths:=6; -elem_factor := 2; -elem_initial_len:=2; - -for i := -slopes upto slopes: - width:= elem_initial_len; - for j:=1 upto lengths: - beginchar(128 + i * lengths + j -1 ,width,0,0); - pickup beam_pen; - draw origin--(lft w,w*i*elem_tan); - endchar; - width:=elem_factor *width; - endfor; - endfor; diff --git a/mutopia/Coriolan/out/dummy.dep b/mutopia/Coriolan/out/dummy.dep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 0000000000..4f89904b66 --- /dev/null +++ b/test/Makefile @@ -0,0 +1,50 @@ +# project LilyPond -- the musical typesetter +# title makefile for test +# file test/Makefile +# +# Copyright (c) 1997 by +# Jan Nieuwenhuizen +# Han-Wen Nienhuys +# + +# subdir level: +# +depth = .. +# + +# generic variables: +# +include ./$(depth)/make/Variables.make +# + +# identify module: +# +NAME = test +MODULE_NAME = test + +# descent order into subdirectories: +# +SUBDIRS = +# + +include ./$(depth)/make/Files.make + +# list of custom libraries: +# +CUSTOMLIBES = \ + +LOADLIBES += +# + +# main target of this module: +# +default: $(EXECUTABLE) +include ./$(depth)/make/Files.make +include ./$(depth)/make/Targets.make +include ./$(depth)/make/Rules.make +# + +EXECUTABLES=bow +include $(depth)/make/Executable.make + + diff --git a/test/bow.cc b/test/bow.cc new file mode 100644 index 0000000000..bb85ea3e6d --- /dev/null +++ b/test/bow.cc @@ -0,0 +1,212 @@ +// vim:sw=2 makeprg=g++\ -g\ bow.cc\ -o\ bow +#include +#define PT +// #define STAFFHEIGHT 16.0 +#define STAFFHEIGHT 20.0 + +#define UP 1 +#define DOWN (-1) + +// mmm +#define STANDALONE + +#include + +typedef void *Paper_def; + +#include "bezier.hh" +#include "bezier.cc" +#include "offset.cc" + +struct Point +{ + Real x, y; +}; + +void +out (Bezier_bow& b) +{ + cout << "save dx,dy,x,y;\n"; + for (int i = 0; i < 4; i++) + cout << "z" << i + 1 << " = (" << b.control_[i].x () + << ", " << b.control_[i].y () << ");\n"; + for (int i = 1; i < 3; i++) + cout << "z" << i + 4 << " = (" << b.return_[i].x () + << ", " << b.return_[i].y () << ");\n"; +#if 0 + cout << "pickup pencircle scaled 0.5pt#;\n"; + cout << "draw z2--z3; draw (50,0)-- 0.5[z2,z3];\n"; +#endif + cout << "pickup pencircle scaled 4pt#;\n"; + for (int i = 0; i < 4; i++) + cout << "drawdot z" << i + 1 << ";\n"; + cout << "path boogje;\n"; +#if 0 + cout << "pickup pencircle scaled 0.4pt#;\n"; + cout << "boogje=z1..controls z2 and z3..z4..controls z5 and z6..cycle;\n"; + cout << "filldraw boogje;\n"; +#else + cout << "pickup pencircle scaled 1.6pt#;\n"; + cout << "boogje=z1..controls z2 and z3..z4;\n"; + cout << "draw boogje;\n"; + cout << "pickup pencircle scaled 0.4pt#;\n"; + cout << "boogje:=z4..controls z5 and z6..z1;\n"; + cout << "draw boogje;\n"; +#endif + cout << "showit; shipit;clearit;\n"; +} + +void +bow (Point* points, int n, int d) +{ + Array notes; + for (int i = 0; i < n; i++) + notes.push (Offset (points[i].x, points[i].y)); +// cout << "pickup pencircle scaled 8pt#;\n"; + cout << "pickup pencircle scaled 2pt#;\n"; + for (int i = 0; i < n; i++) + cout << "drawdot (" << notes[i].x () << ", " << notes[i].y () << ");\n"; + Bezier_bow b (0); + b.set (notes, d); + b.calc (); + out (b); + return; +} + +int +main () +{ + //cout.unsetf(ios::scientific); + cout.setf(ios::fixed); +#if 0 + bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,0, 100,1 }, 6, 1); + bow ((Point[6]){ 0,0, 20,0, 40,30, 60,30, 80,0, 100,1 }, 6, 1); + bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,10, 100,1 }, 6, 1); + bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,40, 100,1 }, 6, 1); + bow ((Point[6]){ 0,0, 20,0, 40,0, 60,40, 80,0, 100,1 }, 6, 1); + bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,50 }, 6, 1); + bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,50 }, 6, -1); + bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,100 }, 6, -1); + bow ((Point[9]){ 0,0, 20,0, 40,-80, 60,0, 80,0, 100,0, 120,0, 140,0, 160,-1 }, 9, -1); + bow ((Point[9]){ 0,0, 40,0, 80,180, 120,0, 160,0, 200,0, 240,0, 280,0, 320,1 }, 9, 1); + bow ((Point[9]){ + {0, 0}, + {19.10645980317711, 1}, + {29.402919606354207, 28}, + {55.389379409531308, 1}, + {73.530839212708514, 1}, + {91.672299015885727, 1}, + {111.35901367452229, 1}, + {131.04572833315891, 1}, + {145.76744299179552, 0} + }, + 9, 1); + bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,0, 100,40 }, 6, 1); + bow ((Point[2]){ 0,0, 20,0 }, 2, 1); + bow ((Point[2]){ 0,0, 20,-10 }, 2, 1); +#endif + bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,0, 100,100 }, 6, 1); + cout << "\\end\n"; + return 0; +} + +// vim:sw=2 makeprg=g++\ -g\ bow.cc\ -o\ bow +#include +#define PT + +// mmm +#define STANDALONE + +#include + +typedef void *Paper_def; + +#include "bezier.hh" +#include "bezier.cc" +#include "mat.hh" + +struct Point +{ + Real x, y; +}; + +void +out (Bezier_bow& b) +{ + cout << "save dx,dy,x,y;\n"; + for (int i = 0; i < 4; i++) + cout << "z" << i + 1 << " = (" << b.control_[i].x () + << ", " << b.control_[i].y () << ");\n"; + for (int i = 1; i < 3; i++) + cout << "z" << i + 4 << " = (" << b.return_[i].x () + << ", " << b.return_[i].y () << ");\n"; +// cout << "pickup pencircle scaled 0.5pt#;\n"; +// cout << "draw z2--z3; draw (50,0)-- 0.5[z2,z3];\n"; + cout << "pickup pencircle scaled 4pt#;\n"; + for (int i = 0; i < 4; i++) + cout << "drawdot z" << i + 1 << ";\n"; +// cout << "pickup pencircle scaled 0.4pt#;\n"; + cout << "pickup pencircle scaled 1.6pt#;\n"; + cout << "path boogje;\n"; +// cout << "boogje=z1..controls z2 and z3..z4..controls z5 and z6..cycle;\n"; + cout << "boogje=z1..controls z2 and z3..z4;\n"; + cout << "dx=x4-x1;\n"; + cout << "dy=y4-y1;\n"; + cout << "draw boogje;\n"; + cout << "pickup pencircle scaled 0.4pt#;\n"; + cout << "boogje:=z4..controls z5 and z6..z1;\n"; + cout << "draw boogje;\n"; +// cout << "filldraw boogje;\n"; + cout << "showit; shipit;clearit;\n"; +} + +void +bow (Point* points, int n, int d) +{ + Array notes; + for (int i = 0; i < n; i++) + notes.push (Offset (points[i].x, points[i].y)); + cout << "pickup pencircle scaled 8pt#;\n"; + for (int i = 0; i < n; i++) + cout << "drawdot (" << notes[i].x () << ", " << notes[i].y () << ");\n"; + Bezier_bow b (0); + b.set (notes, d); + b.calc (); + out (b); + return; +} + +int +main () +{ + //cout.unsetf(ios::scientific); + cout.setf(ios::fixed); +#if 1 + bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,0, 100,1 }, 6, 1); + bow ((Point[6]){ 0,0, 20,0, 40,30, 60,30, 80,0, 100,1 }, 6, 1); + bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,10, 100,1 }, 6, 1); + bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,40, 100,1 }, 6, 1); + bow ((Point[6]){ 0,0, 20,0, 40,0, 60,40, 80,0, 100,1 }, 6, 1); + bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,50 }, 6, 1); + bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,50 }, 6, -1); + bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,100 }, 6, -1); + bow ((Point[9]){ 0,0, 20,0, 40,-80, 60,0, 80,0, 100,0, 120,0, 140,0, 160,-1 }, 9, -1); + bow ((Point[9]){ 0,0, 40,0, 80,180, 120,0, 160,0, 200,0, 240,0, 280,0, 320,1 }, 9, 1); + bow ((Point[9]){ + {0, 0}, + {19.10645980317711, 1}, + {29.402919606354207, 28}, + {55.389379409531308, 1}, + {73.530839212708514, 1}, + {91.672299015885727, 1}, + {111.35901367452229, 1}, + {131.04572833315891, 1}, + {145.76744299179552, 0} + }, + 9, 1); +#endif + bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,0, 100,40 }, 6, 1); + cout << "\\end\n"; + return 0; +} + diff --git a/test/out/dummy.dep b/test/out/dummy.dep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tex/fetdefs.tex b/tex/fetdefs.tex index 1616ccc9f3..b7ba27d281 100644 --- a/tex/fetdefs.tex +++ b/tex/fetdefs.tex @@ -100,7 +100,7 @@ \fi} \def\pianobrace#1{{\bracefont\char #1}} -\def\staffbracket#1{{\bracketfont\char #1}} +\def\staffbracket#1{{\centeralign{\bracketfont\char #1}}} \def\embeddedtex#1{} \def\embeddedps#1{} diff --git a/tex/lily-ps-defs.tex b/tex/lily-ps-defs.tex index 2610706399..9ff22292d5 100644 --- a/tex/lily-ps-defs.tex +++ b/tex/lily-ps-defs.tex @@ -118,60 +118,21 @@ def } bind def staffheight 2 div /slurhtlimit exch def - /slurratio 0.3333 def - % - % (b*ratio)/(1 + b / htlimit) - /getslurcontrol - { - slurhtlimit 90 div /slur_alpha exch def - slurratio 60 div slur_alpha div /slur_beta exch def - slur_beta mul 1 atan slur_alpha mul - } bind def - staffrulethickness 1.5 mul /slur_thick exch def - /draw_slur - { - staffrulethickness setlinewidth - 0 0 moveto - /slur_dir exch def - /slur_height exch def - /slur_dy exch def - /slur_dx exch def - slur_dy slur_dx lily_distance /slur_b exch def - slur_b getslurcontrol slur_height add - slur_dir mul /slur_ht exch def - slur_b getslurcontrol /slur_indent exch def -% - slur_dy slur_dx atan rotate - slur_indent slur_ht - slur_b slur_indent sub slur_ht - slur_b 0 - rcurveto - % - slur_indent neg slur_ht slur_dir slur_thick mul sub - slur_indent slur_b sub slur_ht slur_dir slur_thick mul sub - slur_b neg 0 - rcurveto - % - gsave - fill - grestore - stroke - } bind def - /draw_control_slur - { - staffrulethickness setlinewidth - 0 0 moveto - rcurveto - rcurveto - gsave +/draw_slur +{ + staffrulethickness setlinewidth + 0 0 moveto + rcurveto + rcurveto + gsave fill - grestore - stroke - } bind def + grestore + stroke + } bind def }} - \def\turnOnExperimentalFeatures{% % draw a slur in embedded postscript \special{ps: }} +