1.4.2.jcn4
==========
-* Bugfix: ledger lines on easy-notation note heads.
-
* Windows: bugfix for tex-wrappers, added tex wrapper for dvips.
LilyPond (read: ly2dvi) should now work right out of the box.
`call for help'. Did all the others give up, or did none of them
bother to share their fix/file a bug report? Urg.
-1.4.2.jcn1
-==========
-
* Included mktexnam.patch (again?).
* Documentation fix (Mark Hindley).
* Removed les-nereides from short-examples, as it is tweaked a lot,
contrary to what the webpage claims (didn't know that).
+1.4.2.mb1
+==========
+
+* ly2dvi, titledefs.tex: Typeset copyright notice at the bottom of the
+first page. Make separate page styles for first and last page.
+
+* Bugfix: Default RehearsalMark font-family changed to roman (only
+affects Scheme text markups).
+
+1.4.2.hwn1
+==========
+
+* Added support for Q: statement to abc2ly. (Laura Conrad)
+
+* Tie shape bugfix (Mark Hindley).
+
+* Bugfix: lilypond-book LatexPaper.__setattr__()
+
+* Bugfix: make Hyphen_spanner::brew_molecule() more robust.
+
+* Don't use stdin when no argument specified.
+
+* Naming smobs -> grobs
+
+* Bugfix: ledger lines on easy-notation note heads.
+
1.4.2
=====
@item head
A text to print in the header of all pages. It is not called
@code{header}, because @code{\header} is a reserved word in LilyPond.
+@item copyright
+ A text to print in the footer of the first page. Default is to
+ print the standard footer also on the first page.
@item footer
- A text to print in the footer of all pages
+ A text to print in the footer of all but the last page.
@item tagline
Line to print at the bottom of last page. The default text is ``Lily
was here, @var{version-number}''.
* Debian GNU/Linux
(ftp://ftp.debian.org/debian/pool/main/l/lilypond/)
- * Windows Stable (http://home.austin.rr.com/jbr/jeff/lilypond/)
- Windows Testing (http://www.lilypond.org/gnu-windows/)
+ * Windows Testing (http://www.lilypond.org/gnu-windows/)
Upgrading
xdelta (ftp://ftp.xcf.berkeley.edu/pub/xdelta/). This is much
safer than using patches, and is the recommended way.
- The following command produces `lilypond-1.4.1.tar.gz' from
- `lilypond-1.4.0.tar.gz' identical (up to compression dates) to the
- .1 on the FTP site.
- xdelta patch lilypond-1.4.0-1.4.1.xd lilypond-1.4.0.tar.gz
+ The following command produces `lilypond-1.4.3.tar.gz' from
+ `lilypond-1.4.2.tar.gz' identical (up to compression dates) to the
+ .3 on the FTP site.
+ xdelta patch lilypond-1.4.2-1.4.3.xd lilypond-1.4.2.tar.gz
Requirements
============
A Debian package is also available. You may install it easily by
running `apt-get' as root:
- apt-get install lilypond
+ apt-get install lilypond lilypond-doc
Debian's TeX installation is a bit short on memory, you may want to
increase it like this:
* http://people.debian.org/~foka/lilypond/
(http://people.debian.org/~foka/lilypond/) for latest
- semi-unofficial build of LilyPond 1.3.121 for Debian 2.2 (potato)
+ semi-unofficial build of LilyPond 1.4.2 for Debian 2.2 (potato)
users. The official stable Debian 2.2 is stuck with the old
LilyPond-1.3.24. Since LilyPond-1.4 has been released, the older
lilypond1.3 Debian package is now obsolete.
$ su - root
# dpkg --purge lilypond lilypond1.3
# exit
- $ tar xzf lilypond-1.4.1.tar.gz
- $ cd lilypond-1.4.1
- $ dch -p -v 1.4.1-0.local.1 "Local build."
- $ debuild
+ $ tar xzf lilypond-1.4.3.tar.gz
+ $ cd lilypond-1.4.3
+ $ dch -p -v 1.4.3-0.local.1 "Local build."
+ $ debuild -B
$ su - root
- # dpkg -i ../lilypond_1.4.1*.deb
+ # dpkg -i ../lilypond_1.4.3*.deb
# exit
$
+ Use command `debuild' instead of `debuild -B' if you have a very
+fast machine and want to build the HTML, PS and DVI documentation too.
+
For compilation on a Debian GNU/Linux system you need these packages,
in addition to the those needed for running:
PACKAGE_NAME=LilyPond
MAJOR_VERSION=1
MINOR_VERSION=4
-PATCH_LEVEL=2
-MY_PATCH_LEVEL=jcn5
+PATCH_LEVEL=3
+MY_PATCH_LEVEL=
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
It was created by Anthony Fok <foka@debian.org>
Mon, 16 Apr 2001 22:17:10 -0600
+Copyright:
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License with
+ the Debian GNU/Linux distribution in file /usr/share/common-licenses/GPL;
+ if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ Suite 330, Boston, MA 02111-1307 USA
+This is a dummy package to aid the transition from the old
+"lilypond1.3" package to the newer "lilypond" package.
+It was created by Anthony Fok <foka@debian.org>
+Mon, 16 Apr 2001 22:17:10 -0600
+
Copyright:
This program is free software; you can redistribute it and/or modify
\score { \notes {
- c4
+% First a normal looking repeat:
+ c2 c
+ \property Score.repeatCommands = #'((volta "1."))
+ c c
+ \property Score.repeatCommands = #'((volta #f) end-repeat (volta "2."))
+ c c
+ \property Score.repeatCommands = #'((volta #f))
+% Then a more strange one:
+ c c
\property Score.repeatCommands = #'((volta "93") end-repeat)
- c4 c4
+ c c
\property Score.repeatCommands = #'((volta #f))
- c4 c4
+ c c
}
}
representing the break direction. Do not modify SRC.
*/
SCM
-Grob::handle_broken_smobs (SCM src, SCM criterion)
+Grob::handle_broken_grobs (SCM src, SCM criterion)
{
again:
Grob *sc = unsmob_grob (src);
/*
UGH! breaks on circular lists.
*/
- SCM newcar = handle_broken_smobs (oldcar, criterion);
+ SCM newcar = handle_broken_grobs (oldcar, criterion);
SCM oldcdr = gh_cdr (src);
if (newcar == SCM_UNDEFINED
/*
This is tail-recursion, ie.
- return handle_broken_smobs (cdr, criterion);
+ return handle_broken_grobs (cdr, criterion);
We don't want to rely on the compiler to do this. Without
tail-recursion, this easily crashes with a stack overflow. */
goto again;
}
- SCM newcdr = handle_broken_smobs (oldcdr, criterion);
+ SCM newcdr = handle_broken_grobs (oldcdr, criterion);
return gh_cons (newcar, newcdr);
}
else
Grob * sc = s->broken_into_l_arr_[i];
Line_of_score * l = sc->line_l ();
sc->mutable_property_alist_ =
- handle_broken_smobs (mutable_property_alist_,
+ handle_broken_grobs (mutable_property_alist_,
l ? l->self_scm () : SCM_UNDEFINED);
}
}
if (line && common_refpoint (line, X_AXIS) && common_refpoint (line, Y_AXIS))
{
mutable_property_alist_
- = handle_broken_smobs (mutable_property_alist_,
+ = handle_broken_grobs (mutable_property_alist_,
line ? line->self_scm () : SCM_UNDEFINED);
}
else if (dynamic_cast <Line_of_score*> (this))
{
- mutable_property_alist_ = handle_broken_smobs (mutable_property_alist_,
+ mutable_property_alist_ = handle_broken_grobs (mutable_property_alist_,
SCM_UNDEFINED);
}
else
{
bounds[LEFT] -= gh_scm2double (space);
}
- Real w = bounds.length ();
+ /*
+ we should probably do something more intelligent when bounds is
+ empty, but at least this doesn't crash.
+ */
+ Real w = bounds.empty_b () ? 0 : bounds.length ();
/* for length, use a geometric mean of the available space and some minimum
*/
}
Box b (Interval (-l/2,l/2), Interval (h,h+th));
Molecule mol (Lookup::filledbox (b));
- mol.translate_axis (bounds.center ()
- -sp->relative_coordinate (common, X_AXIS),
- X_AXIS);
+ Real ct = bounds.empty_b () ? 0 : bounds.center () ;
+ mol.translate_axis (ct -sp->relative_coordinate (common, X_AXIS), X_AXIS);
return mol.smobbed_copy ();
}
#funcptr# is the function to call to update this element.
*/
void calculate_dependencies (int final, int busy, SCM funcname);
- static SCM handle_broken_smobs (SCM, SCM criterion);
+ static SCM handle_broken_grobs(SCM, SCM criterion);
virtual void do_break_processing ();
virtual Grob *find_broken_piece (Line_of_score*) const;
if (original_l_)
{
mutable_property_alist_
- = handle_broken_smobs (original_l_->mutable_property_alist_,
+ = handle_broken_grobs(original_l_->mutable_property_alist_,
gh_int2scm (break_status_dir ()));
}
gh_eval_str ((char *)init_scheme_code_string.ch_C());
int p=0;
- const char *arg ;
- while ((arg = oparser_p_static->get_next_arg ()) || p == 0)
+ const char *arg = oparser_p_static->get_next_arg ();
+
+ if (!arg)
+ usage ();
+ else
+ do
{
- String infile;
-
- if (arg)
- infile = arg;
- else
- infile = "-";
-
- // What/when was this supposed to do?
- // It looks like it reset the outname_str_global for every new
- // file, but only if user didn't specify a outname? Huh?
- // if (outname_str_global == "")
+ String infile (arg);
+
+ /* What/when was this supposed to do?
+ It looks like it reset the outname_str_global for every new
+ file, but only if user didn't specify a outname? Huh?
+
+ // if (outname_str_global == "")
+
+ */
{
Midi_def::reset_score_count ();
Paper_def::reset_score_count ();
output_name_global = save_output_name_global;
p++;
- }
+
+ oparser_p_static->get_next_arg ();
+ } while ((arg = oparser_p_static->get_next_arg ()));
delete oparser_p_static;
+ oparser_p_static = 0;
exit (exit_status_global);
}
Grob *me = unsmob_grob (smob);
Spanner *sp = dynamic_cast<Spanner*> (me);
- Font_metric *musfont = Font_interface::get_default_font (me);
-
Molecule r = Percent_repeat_item_interface::x_percent (me, 1, 0.75, 1.6);
// ugh copy & paste.
protected:
virtual void finalize ();
virtual bool try_music (Music*);
- virtual void acknowledge_grob (Grob_info);
virtual void stop_translation_timestep ();
virtual void start_translation_timestep ();
virtual void process_music ();
}
-void
-Percent_repeat_engraver::acknowledge_grob (Grob_info info)
-{
-
-}
void
if (now_mom () > Moment (0))
s = get_property ("stz");
-
+
+
+ // TODO
if (gh_string_p (s))
+
/*
if (i.elem_l_->has_interface (symbol ("lyric-syllable-interface")))
Bezier b = slur_shape (width, h_inf, r_0);
- Offset leave_dir = b.control_[1] - b.control_[0];
-
- Grob *hed =head (me, headdir);
- Real dx = (hed->extent (hed, X_AXIS).length () + x_gap_f)/2.0;
- Real max_gap = leave_dir[Y_AXIS] * dx / leave_dir[X_AXIS];
-
/*
- for small ties (t small) we want to start in the Y-center (so dy = 0), for
- large ties, the tie should appear to come from the center of the
- head, so dy = max_gap
-
- maybe use a different formula?
+ I think this better, particularly for small ties. It always allows the user to move ties if
+ they seem in the wrong place
TODO: what if 2 heads have different size.
- TODO: for small ties, it is better to start over the heads
- iso. next to the heads.
*/
- Real t = (width / staff_space - 5.0); // ugh.
- Real dy = t > 0 ? max_gap * sqr (t / (1 + t)) : 0.0;
- Real ypos = Tie::position_f (me) * staff_space/2 + dir * dy;
+ Real ypos = Tie::position_f (me) * staff_space/2
+ + dir * gh_scm2double (me->get_grob_property ("y-offset"));;
/*
Make sure we don't start on a dots
}
}
/* Ugh. Should eat other requests, script etc. too. */
- else if (Tie_req *t = dynamic_cast<Tie_req*> (m))
+ else if (dynamic_cast<Tie_req*> (m))
return true;
}
return false;
"override" "set" "revert" "partial" "paper" "penalty" "property" "pt"
"relative" "remove" "repeat" "addlyrics" "partcombine" "score"
"script" "stylesheet" "skip" "textscript" "tempo" "translator"
-"transpose" "type"
+"transpose" "type" "unset"
))
(kwregex (mapconcat (lambda (x) (concat "\\\\" x)) keywords "\\|")))
Begin3
Title: LilyPond
-Version: 1.4.2
-Entered-date: 28MAY01
+Version: 1.4.3
+Entered-date: 13JUN01
Description: @BLURB@
Keywords: music notation typesetting midi fonts engraving
Author: hanwen@cs.uu.nl (Han-Wen Nienhuys)
janneke@gnu.org (Jan Nieuwenhuizen)
Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys)
Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert
- 1000k lilypond-1.4.2.tar.gz
+ 1000k lilypond-1.4.3.tar.gz
Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
- 1000k lilypond-1.4.2.tar.gz
+ 1000k lilypond-1.4.3.tar.gz
Copying-policy: GPL
End
%define info yes
Name: lilypond
-Version: 1.4.2
+Version: 1.4.3
Release: 1
License: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.4.2.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.4.3.tar.gz
Summary: Create and print music notation
URL: http://www.cs.uu.nl/~hanwen/lilypond
BuildRoot: /tmp/lilypond-install
Distribution: SuSE Linux 7.0 (i386)
Name: lilypond
-Version: 1.4.2
+Version: 1.4.3
Release: 2
Copyright: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.4.2.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.4.3.tar.gz
# music notation software for.. ?
Summary: A program for printing sheet music.
URL: http://www.lilypond.org/
(direction . 1)
(breakable . #t)
- (font-family . number)
+ (font-family . roman)
(font-shape . upright)
(font-relative-size . 1)
(visibility-lambda . ,end-of-line-invisible)
(details . ((ratio . 0.333) (height-limit . 1.0)))
(thickness . 1.2)
(x-gap . 0.2)
+ (y-offset . 0.6)
(minimum-length . 2.5)
(meta . ,(grob-description "Tie" tie-interface ))
))
(grob-property-description 'word-space number? "elongate left by this much (FIXME: cumbersome semantics).")
(grob-property-description 'x-gap number? "horizontal gap between notehead and tie.")
(grob-property-description 'y-free number? "minimal vertical gap between slur and noteheads or stems.")
+(grob-property-description 'y-offset number? "extra vertical offset for ties away from the center line.")
(grob-property-description 'y number? "set by beam: position of left edge.")
DIGITS='0123456789'
alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
HSPACE=' \t'
-
+midi_specs = ''
def check_clef(s):
if not s:
outf.write("}")
outf.write ("\n}")
+def try_parse_q(a):
+ global midi_specs
+ #assume that Q takes the form "Q:1/4=120"
+ #There are other possibilities, but they are deprecated
+ if string.count(a, '/') == 1:
+ array=string.split(a,'/')
+ numerator=array[0]
+ if numerator != 1:
+ sys.stderr.write("abc2ly: Warning, unable to translate a Q specification with a numerator of %s: %s\n" % (numerator, a))
+ array2=string.split(array[1],'=')
+ denominator=array2[0]
+ perminute=array2[1]
+ duration=str(string.atof(denominator)/string.atoi(numerator))
+ midi_specs=string.join(["\\tempo", duration, "=", perminute])
+ else:
+ sys.stderr.write("abc2ly: Warning, unable to parse Q specification: %s\n" % a)
+
def dump_score (outf):
outf.write (r"""\score{
\notes <
outf.write ("\t\t\\StaffContext\n")
# outf.write ("\t\t\\consists Staff_margin_engraver\n")
outf.write ("\t }\n")
- outf.write ("\t}\n\t\\midi {}\n}\n")
+ outf.write ("\t}\n\t\\midi {%s}\n}\n" % midi_specs)
lyrics_append(a)
if g == 'w': # vocals
slyrics_append (a)
-
+ if g == 'Q': #tempo
+ try_parse_q (a)
return ''
return ln
def __setattr__(self, name, value):
if type(value) == type("") and \
dimension_conversion_dict.has_key (value[-2:]):
- f = dimension_conversion_dict[dim]
+ f = dimension_conversion_dict[value[-2:]]
self.__dict__[name] = f(float(value[:-2]))
else:
self.__dict__[name] = value
s = s + r'''
\usepackage[latin1]{inputenc}
\input{titledefs}
-\makeatletter
-\renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\thefooter}}%
-\renewcommand{\@evenfoot}{\parbox{\textwidth}{\mbox{}\thefooter}}%
'''
if extra['pagenumber'] and extra['pagenumber'][-1] and extra['pagenumber'][-1] != 'no':
- s = s + r'''
-\renewcommand{\@evenhead}{\hbox to\textwidth{\textbf{\thepage}\hfill{\small\theheader}}}
-\renewcommand{\@oddhead}{\hbox to \textwidth{{\small\theheader}\hfill\textbf{\thepage}}}
-'''
+ s = s + '\\pagestyle{plain}\n'
else:
s = s + '\\pagestyle{empty}\n'
- s = s + '\\makeatother\n'
s = s + '\\begin{document}\n'
-
+ s = s + '\\thispagestyle{firstpage}\n'
first = 1
for t in tfiles:
s = s + one_latex_definition (t, first)
first = 0
- s = s + r'''
-%% I do not see why we want to clobber the footer here
-%% \vfill\hfill\parbox{\textwidth}{\mbox{}\makelilypondtagline}
-%% Well, maybe you don't submit music to mutopia?
-%% I would not object to this kind of change, but I don't know how
-%% to get the last mutopia tagline right (ie: no footer on last page)
-%% Please check that mutopia footers and endfooter are OK before changing
-%% this again. -- jcn
-% the \mbox{} helps latex if people do stupid things in tagline
-\makeatletter
-\if@twoside
- \ifodd\thepage
- \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\makelilypondtagline}}%
- \else
- \renewcommand{\@evenfoot}{\parbox{\textwidth}{\mbox{}\makelilypondtagline}}%
- \fi
- \else
- \renewcommand{\@thefoot}{\parbox{\textwidth}{\mbox{}\makelilypondtagline}}%
-\fi
-\makeatother
-'''
+
+ s = s + '\\thispagestyle{lastpage}\n'
s = s + '\\end{document}'
return s
% these names can't be changed: they're uses in mutopia headers
\def\theheader
{
- \ifx\lilypondhead\undefined\else%
+ \ifx\lilypondhead\undefined\relax\else%
\lilypondhead\fi
}
\def\thefooter
{
- \ifx\lilypondfooter\undefined\else%
+ \ifx\lilypondfooter\undefined\relax\else%
\lilypondfooter\fi
}
\def\makelilypondtagline
{
- \ifx\lilypondtagline\undefined\else\lilypondtagline\fi
+ \ifx\undefined\lilypondtagline\relax\else\lilypondtagline\fi
}
+\def\thecopyright
+{
+ \ifx\lilypondcopyright\undefined\thefooter\else%
+ \lilypondcopyright\fi
+}
+%
+% Moved header and footer definitions here from the ly2dvi script.
+% Separate page styles for first, last and ordinary (plain) pages.
+\makeatletter
+\renewcommand{\ps@plain}{
+ \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\thefooter}}%
+ \renewcommand{\@evenfoot}{\@oddfoot}%
+ \renewcommand{\@evenhead}{\hbox to\textwidth{\textbf{\thepage}\hfill{\small\theheader}}}
+ \renewcommand{\@oddhead}{\hbox to
+ \textwidth{{\small\theheader}\hfill\textbf{\thepage}}}}
+\newcommand{\ps@firstpage}{
+ \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\thecopyright}}%
+ \renewcommand{\@evenfoot}{\@oddfoot}}
+\newcommand{\ps@lastpage}{
+ \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\makelilypondtagline}}%
+ \renewcommand{\@evenfoot}{\@oddfoot}}
+\makeatother
\endinput