resulting binaries can be found in the subdirectories @file{out/} (which
contain all files generated during compilation).
+
+@section Emacs mode
+
+
+An emacs mode for LilyPond is included with the source archive as
+@file{lilypond-mode.el} and @file{lilypond-font-lock.el}. If you have
+an RPM, it is in @file{/usr/share/doc/lilypond-X/}. You have to install
+it yourself.
+
+Add this to your ~/.emacs or ~/.emacs.el:
+@example
+ (load-library "lilypond-mode.el")
+ (setq auto-mode-alist
+ (cons '("\\.ly$" . LilyPond-mode) auto-mode-alist))
+ (add-hook 'LilyPond-mode-hook (lambda () (turn-on-font-lock)))
+@end example
+
+If you have the latest LilyPond-1.3.x Debian package, LilyPond-mode
+is automatically loaded, so you need not modify your ~/.emacs file.
+
+
@section Configuring for multiple platforms
If you want to build multiple versions of LilyPond with different
@item tetex-devel
@end itemize
+@section SuSE
+
+[TODO: document this]
+
+Install @code{tetex}, @code{te_mpost}, @code{te_kpath}.
+
+
@section Debian GNU/Linux
A Debian package is also available. You may install it easily by using
@titlepage
@title GNU LilyPond
@subtitle The music typesetter
-@author Han-Wen Nienhuys, Jan Nieuwenhuizen, Adrian Mariano, Tom Cato Amundsen
+@author
Copyright @copyright{} 1999--2001 by the authors
@ifinfo
This file documents GNU LilyPond.
-Copyright 1999 Han-Wen Nienhuys, Jan Nieuwenhuizen and Adrian Mariano
+Copyright 1999 Han-Wen Nienhuys, Jan Nieuwenhuizen, Adrian Mariano
+Tom Cato Amundsen.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1
--- /dev/null
+
+
+ % < becomes |
+\score {\notes { \context Staff < f''1
+ { s4 \< \! s4 } > }
+
+ \paper { linewidth = -1.; }
+ }
+
--- /dev/null
+\header{
+texidoc = "Broken crescendi should look be open on one side.";
+}
+
+\score { \notes \relative c'' {
+ c1 \< \break \! c1 \> \break \! c1
+ }
+ \paper {
+ linewidth = 10.\cm;
+ }
+}
+
\header{
texidoc=" Dynamics appear below or above the staff. If multiple
dynamics are linked with (de)crescendi, they should be on the same
-line. Isolated dynamics may be forced up or down. ";
+line. Isolated dynamics may be forced up or down.
+ ";
}
--- /dev/null
+\header {
+texidoc = "Measure and beat repeats are supported.";
+}
+
+\score { \notes \relative c' \context Voice { \time 4/4;
+ \repeat "percent" 2 { c2 }
+
+ % the chairman dances
+ \repeat "percent" 2 { g'8 g c, c }
+ \repeat "percent" 4 { b8 b8 }
+ \repeat "percent" 2 { c8 d es f g4 r4 }
+
+ % riff
+ \repeat "percent" 2 { r8. a16 g8. a16 bes8. a16 f8 d | a c8 ~ c8 d8 ~ d8 r8 r4 }
+
+
+
+ }}
\header{
texidoc="
Theads can be traced automagically when they switch staffs by setting
-property @code{followThread}.
+property @code{followVoice}.
";
}
% followThread: connect note heads with line when thread switches staff
fragment = \notes {
\context PianoStaff <
- \property PianoStaff.followThread = ##t
+ \property PianoStaff.followVoice = ##t
\context Staff \context Voice {
c'1
\translator Staff=two
static Molecule beam (Real, Real, Real) ;
static Molecule dashed_slur (Bezier, Real thick, Real dash) ;
static Molecule blank (Box b) ;
- static Molecule filledbox (Box b) ;
+ static Molecule filledbox (Box b) ;
+ static Molecule repeat_slash( Real w, Real slope, Real th);
};
#endif // LOOKUP_HH
--- /dev/null
+/*
+ percent-repeat-item.hh -- declare Percent_repeat_item_interface
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+
+#ifndef PERCENT_REPEAT_ITEM_HH
+#define PERCENT_REPEAT_ITEM_HH
+
+#include "grob.hh"
+
+class Percent_repeat_item_interface
+{
+public:
+ DECLARE_SCHEME_CALLBACK (beat_slash, (SCM ));
+ DECLARE_SCHEME_CALLBACK (double_percent, (SCM ));
+ static Molecule x_percent (Grob*,int,Real,Real );
+ static Molecule brew_slash (Grob*);
+};
+
+#endif /* PERCENT_REPEAT_ITEM_HH */
+
return m;
}
+/*
+ TODO: should use slope instead? Angle gives nasty rad <-> degree
+ conversions.
+*/
+Molecule
+Lookup::repeat_slash (Real w, Real s, Real t)
+{
+ SCM wid = gh_double2scm (w);
+ SCM sl = gh_double2scm (s);
+ SCM thick = gh_double2scm (t);
+ SCM slashnodot = gh_list (ly_symbol2scm ("repeat-slash"),
+ wid, sl, thick, SCM_UNDEFINED);
+
+ Box b (Interval (0, w + sqrt (sqr(t/s) + sqr (t))),
+ Interval (0, w * s));
+
+ return Molecule (b, slashnodot);
+}
#include "spanner.hh"
#include "staff-symbol-referencer.hh"
#include "text-item.hh"
+#include "percent-repeat-item.hh"
+
void
Multi_measure_rest::set_interface (Grob*me)
SCM
Multi_measure_rest::percent (SCM smob)
{
+
Grob *me = unsmob_grob (smob);
Spanner *sp = dynamic_cast<Spanner*> (me);
Font_metric *musfont = Font_interface::get_default_font (me);
- Molecule r (musfont->find_by_name ("scripts-repeatsign"));
+ Molecule r = Percent_repeat_item_interface::x_percent (me, 1, 0.75, 1.6);
// ugh copy & paste.
#include "spanner.hh"
#include "item.hh"
#include "percent-repeat-iterator.hh"
+#include "bar.hh"
+
+#include "score-engraver.hh"
+#include "translator-group.hh"
/**
This acknowledges repeated music with "percent" style. It typesets
MEASURE,
DOUBLE_MEASURE,
} repeat_sign_type_ ;
-
+
+ Item * beat_slash_;
+ Item * double_percent_;
Spanner * perc_p_;
Spanner * finished_perc_p_;
Item * stem_tremolo_;
perc_p_ = finished_perc_p_ = 0;
repeat_ =0;
stem_tremolo_ = 0;
+
+ beat_slash_ = 0;
+ double_percent_ = 0;
}
bool
stop_mom_ = start_mom_ + Moment (count) * body_length_;
next_moment_ = start_mom_ + body_length_;
- SCM m = get_property ("timeSignatureFraction");
- Moment mlen (1,
- gh_scm2int (gh_cdr (m)));
+ SCM m = get_property ("measureLength");
+ Moment meas_len;
+ if (unsmob_moment (m))
+ meas_len = *unsmob_moment (m);
- if (mlen == body_length_)
+ if (body_length_ < meas_len &&
+ meas_len.mod_rat (body_length_) == Moment (0,0))
repeat_sign_type_ = BEAT;
+ else if (meas_len == body_length_)
+ repeat_sign_type_ = MEASURE;
+ else if (Moment (2)* meas_len == body_length_)
+ {
+ repeat_sign_type_ = DOUBLE_MEASURE;
+ next_moment_ += meas_len ;
+ }
else
{
- mlen *= gh_scm2int (gh_car (m));
- if (mlen == body_length_)
- repeat_sign_type_ = MEASURE;
- else if (Moment (2)* mlen == body_length_)
- repeat_sign_type_ = DOUBLE_MEASURE;
-
- if (repeat_sign_type_ != MEASURE)
- {
- warning (_ ("Don't know yet how to handle this percent repeat."));
- return false;
- }
+ warning (_ ("Don't know how to handle a percent repeat of this length."));
+ return false;
}
repeat_ = rp;
{
if (repeat_sign_type_ == BEAT)
{
- ;
+ beat_slash_ = new Item (get_property ("RepeatSlash"));
+ announce_grob (beat_slash_, repeat_);
}
else if (repeat_sign_type_ == MEASURE)
{
perc_p_->set_bound (LEFT, unsmob_grob (col));
announce_grob (perc_p_, repeat_);
}
+ else if (repeat_sign_type_ == DOUBLE_MEASURE)
+
+ {
+ double_percent_ = new Item (get_property ("DoublePercentRepeat"));
+ announce_grob (double_percent_, repeat_);
+
+ /*
+ forbid breaks on a % line. Should forbid all breaks, really.
+ */
+ Score_engraver * e = 0;
+ Translator * t = daddy_grav_l ();
+ for (; !e && t; t = t->daddy_trans_l_)
+ {
+ e = dynamic_cast<Score_engraver*> (t);
+ }
+ if (!e)
+ programming_error ("No score engraver!");
+ else
+ e->forbid_breaks (); // guh. Use properties!
+ }
next_moment_ = next_moment_ + body_length_;
}
}
+
void
Percent_repeat_engraver::finalize ()
{
typeset_grob (finished_perc_p_);
finished_perc_p_ = 0;
}
+
+ if (beat_slash_)
+ {
+ typeset_grob (beat_slash_);
+ beat_slash_ = 0;
+ }
+
+ if (double_percent_)
+ {
+ typeset_grob (double_percent_);
+ double_percent_ = 0;
+ }
}
void
Percent_repeat_engraver::acknowledge_grob (Grob_info info)
{
+
}
void
Percent_repeat_engraver::start_translation_timestep ()
{
- if (perc_p_ && stop_mom_ == now_mom ())
+ if (stop_mom_ == now_mom ())
{
- finished_perc_p_ = perc_p_;
- typeset_perc ();
+ if (perc_p_)
+ {
+ finished_perc_p_ = perc_p_;
+ typeset_perc ();
+ }
repeat_ = 0;
perc_p_ = 0;
repeat_sign_type_ = UNKNOWN;
--- /dev/null
+/*
+ percent-repeat-item.cc -- implement Percent_repeat_item_interface
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+#include <math.h>
+
+#include "grob.hh"
+#include "lookup.hh"
+#include "molecule.hh"
+#include "font-interface.hh"
+#include "font-metric.hh"
+#include "percent-repeat-item.hh"
+
+
+Molecule
+Percent_repeat_item_interface::brew_slash ( Grob *me)
+{
+ Real slope = gh_scm2double (me->get_grob_property ("slope"));
+ Real wid = 2.0 / slope;
+
+ /*
+ todo: check out if in staff-rule thickness normally.
+ */
+ Real thick = gh_scm2double (me->get_grob_property ("thickness"));
+ Molecule m = Lookup::repeat_slash (wid, slope, thick);
+ m.translate_axis (-m.extent (Y_AXIS).center (), Y_AXIS);
+ return m;
+}
+
+/*
+ todo: use grob props for dot_neg_kern, slash_neg_kern?
+ */
+Molecule
+Percent_repeat_item_interface::x_percent (Grob *me, int count,
+ Real dot_neg_kern,
+ Real slash_neg_kern)
+{
+ Molecule m ;
+ Molecule s = brew_slash (me);
+
+ for (int i = count; i--;)
+ {
+ m.add_at_edge (X_AXIS, RIGHT, s, -slash_neg_kern);
+ }
+ Molecule d1 = Font_interface::get_default_font (me)->find_by_name ("dots-dot");
+ Molecule d2 = d1;
+ d1.translate_axis (0.5, Y_AXIS );
+ d2.translate_axis (-0.5, Y_AXIS);
+
+ m.add_at_edge (X_AXIS, LEFT, d1, -dot_neg_kern);
+ m.add_at_edge (X_AXIS, RIGHT, d2, -dot_neg_kern);
+
+ return m;
+}
+
+MAKE_SCHEME_CALLBACK(Percent_repeat_item_interface,double_percent,1);
+SCM
+Percent_repeat_item_interface::double_percent (SCM grob)
+{
+ Grob *me = unsmob_grob (grob);
+ Molecule m = x_percent (me, 2, 0.75, 1.6);
+ m.translate_axis (- m.extent (X_AXIS).center (), X_AXIS);
+ return m.smobbed_copy ();
+}
+
+MAKE_SCHEME_CALLBACK(Percent_repeat_item_interface,beat_slash,1);
+SCM
+Percent_repeat_item_interface::beat_slash (SCM grob)
+{
+ Grob *me = unsmob_grob (grob);
+ Molecule m = brew_slash (me);
+
+ return m.smobbed_copy ();
+}
+
+
+
+
+
+
+
me->get_grob_property ("bracket-thick"),
SCM_UNDEFINED);
+ /*
+TODO: sort this out.
+
+Another thing:
+In system-start-delimiter.cc I see the line
+
+ Real h = height + 2 * arc_height;
+
+But I really think that you mean
+
+ Real h = height + 2 * arc_width;
+
+(arc_height changes the x-axis-size of arc ; arc_width changes the
+y-axis-size)
+Will not fix it since I'm not sure.
+
+-Rune
+
+ */
Real h = height + 2 * arc_height;
Box b (Interval (0, 1.5), Interval (-h/2, h/2));
Molecule mol (b, at);
}
else if (Beam::has_interface (i.elem_l_))
{
+ /*
+ TODO:
+
+ ugh, superfluous. Should look at
+
+ tuplet -> note-column -> stem -> beam
+
+ to find the beam(s) of a tuplet
+ */
+
for (int j = 0; j < started_span_p_arr_.size (); j++)
if (started_span_p_arr_[j])
Tuplet_bracket::add_beam (started_span_p_arr_[j],i.elem_l_);
draw z1..z2..z3..z4..cycle;
fet_endchar;
-fet_beginchar("Repeatsign", "repeatsign", "repeatsign")
- set_char_box(staff_space#, staff_space#, staff_space#, staff_space#);
-
- save dot_diam;
- 2 dot_diam# = staff_space# - stafflinethickness#;
- define_pixels(dot_diam);
-
- penpos1(dot_diam,0);
- z1l=(-b,-d);
- penpos2(dot_diam,0);
- z2r=(w,h);
- filldraw z1l--z2l{right}--z2r{down}--z1r{right}--cycle;
- penlabels (1,2);
-
- pickup pencircle scaled dot_diam;
- draw (-staff_space/2, staff_space/2);
- draw (staff_space/2, -staff_space/2);
-fet_endchar;
-
fet_beginchar("Segno", "segno", "segno")
save thin, thick, ball_diam, darkness, pointheight;
save wd, ht, thick_nibangle, ball_nib_thick;
% round cappings
1 setlinecap
+/euclidean_length
+{
+ 1 copy mul exch 1 copy mul add sqrt
+} bind def
+
/draw_beam % width slope thick
{
2 div /beam_thick exch def
closepath fill
} bind def
-/draw_decrescendo % width height cons thick
-{
- setlinewidth
- /cresc_cont exch def
- /cresc_ht exch def
- /cresc_wd exch def
-
- cresc_wd cresc_cont moveto
- 0 cresc_ht lineto
- stroke
- cresc_wd cresc_cont neg moveto
- 0 cresc_ht neg lineto
- stroke
-} bind def
-
-/draw_crescendo % width height cons thick
-{
- setlinewidth
- /cresc_cont exch def
- /cresc_ht exch def
- /cresc_wd exch def
-
- 0 cresc_cont moveto
- cresc_wd cresc_ht lineto
- stroke
- 0 cresc_cont neg moveto
- cresc_wd cresc_ht neg lineto
- stroke
-} bind def
+/draw_repeat_slash % width slope thick
+{
+ /beamthick exch def
+ /slope exch def
+ /width exch def
+ beamthick beamthick slope div euclidean_length
+ /xwid exch def
+ 0 0 moveto
+ xwid 0 rlineto
+ width slope width mul rlineto
+ xwid neg 0 rlineto
+% width neg width angle sin mul neg rlineto
+ closepath fill
+} bind def
-/lily_distance
-{
- 1 copy mul exch 1 copy mul add sqrt
-} bind def
+/draw_hairpin % width start_h end_h thick
+{
+ setlinewidth
+ /end_h exch def
+ /start_h exch def
+ /wid exch def
+ 0 start_h moveto
+ wid end_h lineto
+ stroke
+ 0 start_h neg moveto
+ wid end_h neg lineto
+ stroke
+} bind def
/draw_tuplet % height gap dx dy thick dir
{
} bind def
% simple, but does it work everywhere?
+% explain ? --hwn
/draw_ez_ball % ch letter_col ball_col font
{
% font
(define (char i)
(invoke-char " show" i))
- (define (crescendo thick w h cont )
- (string-append
- (numbers->string (list w h (inexact->exact cont) thick))
- " draw_crescendo"))
+ (define (hairpin thick width starth endh )
+ (string-append
+ (numbers->string (list width starth endh thick))
+ " draw_hairpin"))
+
;; what the heck is this interface ?
(define (dashed-slur thick dash l)
(string-append
" "
(ly-number->string off)
" ] 0 draw_dashed_line"))
-
- (define (decrescendo thick w h cont)
- (string-append
- (numbers->string (list w h (inexact->exact cont) thick))
- " draw_decrescendo"))
-
-
+
+ (define (repeat-slash wid slope thick)
+ (string-append (numbers->string (list wid slope thick))
+ " draw_repeat_slash"))
+
(define (end-output)
"\nshowpage\n")
(define tuplet ,tuplet)
(define bracket ,bracket)
(define char ,char)
- (define crescendo ,crescendo)
+ (define hairpin ,hairpin)
(define volta ,volta)
(define bezier-sandwich ,bezier-sandwich)
(define dashed-line ,dashed-line)
(define dashed-slur ,dashed-slur)
- (define decrescendo ,decrescendo)
(define end-output ,end-output)
(define experimental-on ,experimental-on)
(define filledbox ,filledbox)
(define stem ,stem)
(define stop-line ,stop-line)
(define stop-last-line ,stop-line)
+ (define repeat-slash ,repeat-slash)
(define text ,text)
(define no-origin ,no-origin)
(define define-origin ,define-origin)
(define ez-ball ,ez-ball)
))
+ ((eq? action-name 'repeat-slash) repeat-slash)
((eq? action-name 'tuplet) tuplet)
((eq? action-name 'beam) beam)
((eq? action-name 'bezier-sandwich) bezier-sandwich)
((eq? action-name 'bracket) bracket)
((eq? action-name 'char) char)
- ((eq? action-name 'crescendo) crescendo)
((eq? action-name 'dashed-line) dashed-line)
((eq? action-name 'dashed-slur) dashed-slur)
- ((eq? action-name 'decrescendo) decrescendo)
+ ((eq? action-name 'hairpin) hairpin)
((eq? action-name 'experimental-on) experimental-on)
((eq? action-name 'filledbox) filledbox)
((eq? action-name 'ez-ball) ez-ball)
(define (dashed-slur thick dash l)
(embedded-ps ((ps-scm 'dashed-slur) thick dash l)))
- (define (crescendo thick w h cont)
- (embedded-ps ((ps-scm 'crescendo) thick w h cont)))
+ (define (hairpin thick w sh eh)
+ (embedded-ps ((ps-scm 'hairpin) thick w sh eh)))
(define (char i)
(string-append "\\char" (inexact->string i 10) " "))
(define (dashed-line thick on off dx dy)
(embedded-ps ((ps-scm 'dashed-line) thick on off dx dy)))
- (define (decrescendo thick w h cont)
- (embedded-ps ((ps-scm 'decrescendo) thick w h cont)))
-
(define (font-load-command name-mag command)
(string-append
"\\font\\" command "="
(define (experimental-on)
"")
+ (define (repeat-slash w a t)
+ (embedded-ps ((ps-scm 'repeat-slash) w a t)))
+
(define (font-switch i)
(string-append
"\\" (font i) "\n"))
(define bezier-sandwich ,bezier-sandwich)
(define bracket ,bracket)
(define char ,char)
- (define crescendo ,crescendo)
(define dashed-line ,dashed-line)
(define dashed-slur ,dashed-slur)
- (define decrescendo ,decrescendo)
+ (define hairpin ,hairpin)
(define end-output ,end-output)
(define experimental-on ,experimental-on)
(define filledbox ,filledbox)
(define volta ,volta)
(define define-origin ,define-origin)
(define no-origin ,no-origin)
+ (define repeat-slash ,repeat-slash)
))
((eq? action-name 'beam) beam)
((eq? action-name 'tuplet) tuplet)
((eq? action-name 'bracket) bracket)
- ((eq? action-name 'crescendo) crescendo)
+ ((eq? action-name 'hairpin) hairpin)
((eq? action-name 'dashed-line) dashed-line)
((eq? action-name 'dashed-slur) dashed-slur)
- ((eq? action-name 'decrescendo) decrescendo)
((eq? action-name 'end-output) end-output)
((eq? action-name 'experimental-on) experimental-on)
((eq? action-name 'font-def) font-def)