* Large cleanups, enhanced design and GUILE integration for smaller
memory footprint and more flexible code.
-* Direct output to PostScript (optional), PDFTeX or as GUILE script.
+* Direct output to PostScript (optional), PDFTeX or as GUILE script
+ (default output still to plain TeX).
-* convertors for ABC and MUP formats.
+* Convertors for ABC and MUP formats.
-* Font: now available as scaleable PostScript. New glyphs: time
+* Font: now available as scalable PostScript. New glyphs: time
signature, more note heads.
* Enhanced input: semi-automatic beaming, (nested) tuplets, (nested)
repeats, automatic staff switching, chordnames, automatic Lyrics
durations.
-* Grace notes, volta brackets, better spacing, multiple styles for
- note heads and time signatures, breathing signs, lyric extenders,
- cross staff beaming and slurring.
+* Grace notes, volta brackets, multiple styles for note heads and
+ time signatures, breathing signs, lyric extenders, cross staff
+ beaming and slurring.
-* --safe option for the paranoid
+* --safe option for the paranoid.
* More elegant spacing. Text is spaced exactly.
-* lots of bugfixes
+* Lots of bugfixes.
-*-outline-layout:(2 (-1 -1 0 :) 0);outline-stylish-prefixes:nil -*-
* GNU LilyPond TODO
-Features you cannot find in the doco as working, should be
+Features you cannot find in the documentation as working, should be
mentioned here. This is an assorted collection of stuff that will be
-done, might be done, or is an idea that I want to think about
+done, might be done, or is an idea that we want to think about.
Most of the items are marked in the code as well
-Grep for TODO and ugh/ugr/urg.
+Grep -i for TODO, FIXME and ugh/ugr/urg.
.* TODO before 1.2
. * align left edge of broken (de)cresc/slur/tie/tuplet/volta
. * auto-staff-switching.
+. * staccato-dot placement/quantisation is broken again
. * warning if feta-nummer.tfm not found
. * broken examples:
input/star-spangled-banner.ly: hw?
-mutopia/Coriolan/*
. * spacing of accidentals
. * key restorations & repeats
. * rename \paper?
. * rhythmic staff & accidentals.
. * use melismaBusy in Lyric context to typeset melismata correctly.
. * ly2dvi/lilypond logfile.
+. * def stem dir.
. * hang Item on Spanner
. * do --safe for PS output?
. * msgfmt -o check?
\cadenza , \meter, should all be \properties
. * fix singleStaffBracket
. * rename
-. * abbreviation-beam -> (measured/unmeasured) tremolo
. * partial -> anacrouse
. * move paper vars into engraver properties
. * add new glyphs to font.ly
-% when tightly spaced, hinterfleisch -> 0 (and not: -> note-width)
-% we need a mininum of about a note-width/interline space before
-% bar line
+% When tightly spaced, hinterfleisch -> 0.
+% Stems may touch the bar lines, opposite stems may touch eachother.
+% We need a mininum of about a note-width/interline space in these
+% situations, so that in tightly spaced music all vertical lines
+% are about equally spaced.
-% set rediculously tight
\score {
- \notes { \time 2/2; c'2 c'2 \time 2/2; }
- \paper { linewidth = 2.0 \cm;
- indent = 0.0;
+ \notes \relative c''{
+ r1 e4 f, e' f,
+ }
+ \paper {
+ linewidth = 25.0 \mm;
+ indent = 0.0\mm;
}
}
--- /dev/null
+\stemup
+f'-. g-. a-. b-. c-. d-. e-.
--- /dev/null
+[:16 c'1 d]
+[:8 c2 d]
+[:16 c4 d]
+[:32 c16 d]
+[:32 c16 d]
+[:16 c8 d]
\context Staff <
\context Voice = VA {
\property Voice.forceHorizontalShift = "0.1"
- \stemup \shifton
+ % \stemup \shifton
+ \property Voice.verticalDirection=1
+ \property Voice.horizontalNoteShift=1
<g' d'>
}
\context Voice = VB {
- \stemdown
- \shifton
+ %\stemdown \shifton
+ \property Voice.verticalDirection=-1
+ \property Voice.horizontalNoteShift=1
\property Voice.forceHorizontalShift = "-0.1"
<bes f'>
}
#include "musical-request.hh"
#include "bar.hh"
#include "beam.hh"
-#include "abbreviation-beam.hh"
+#include "chord-tremolo.hh"
#include "rest.hh"
#include "stem.hh"
#include "debug.hh"
{
junk_beam ();
}
- else if (Abbreviation_beam *b = dynamic_cast<Abbreviation_beam*> (info.elem_l_))
+ else if (Chord_tremolo *b = dynamic_cast<Chord_tremolo*> (info.elem_l_))
{
junk_beam ();
}
#include <math.h>
+#include "chord-tremolo.hh"
#include "new-beaming.hh"
#include "proto.hh"
#include "dimensions.hh"
for (int i=0; i < stems_.size (); i++)
{
Stem *s = stems_[i];
-#if 0
- // abbreviation beam needs to beam over invisible stems of wholes
- if (s->invisible_b ())
- continue;
-#endif
+ /*
+ Chord tremolo needs to beam over invisible stems of wholes
+ */
+ if (!dynamic_cast<Chord_tremolo*> (this))
+ {
+ if (s->invisible_b ())
+ continue;
+ }
Stem_info info (s, multiple_i_);
if (leftx == 0)
// UGH
Real nw_f;
- if (here->type_i ()== 1)
+ if (!here->head_l_arr_.size ())
+ nw_f = 0;
+ else if (here->type_i ()== 1)
nw_f = paper_l ()->get_var ("wholewidth");
else if (here->type_i () == 2)
nw_f = paper_l ()->note_width () * 0.8;
--- /dev/null
+/*
+ abbreviation-beam-engraver.cc -- implement Chord_tremolo_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+
+#include "duration-convert.hh"
+#include "time-description.hh"
+#include "chord-tremolo-engraver.hh"
+#include "stem.hh"
+#include "chord-tremolo.hh"
+#include "musical-request.hh"
+#include "misc.hh"
+#include "warn.hh"
+#include "score-engraver.hh"
+
+ADD_THIS_TRANSLATOR (Chord_tremolo_engraver);
+
+Chord_tremolo_engraver::Chord_tremolo_engraver ()
+{
+ reqs_drul_[LEFT] = reqs_drul_[RIGHT] = 0;
+ abeam_p_ = 0;
+ finished_abeam_p_ = 0;
+ prev_start_req_ = 0;
+}
+
+bool
+Chord_tremolo_engraver::do_try_music (Music* m)
+{
+ if (Chord_tremolo_req* b = dynamic_cast <Chord_tremolo_req *> (m))
+ {
+ Direction d = b->span_dir_;
+ if (reqs_drul_[d] && !reqs_drul_[d]->equal_b (b))
+ return false;
+
+ if ((d == STOP) && !abeam_p_)
+ {
+ m->warning (_ ("No abbreviation beam to end"));
+ return false;
+ }
+
+ reqs_drul_[d] = b;
+ return true;
+ }
+
+ return false;
+}
+
+void
+Chord_tremolo_engraver::do_process_requests ()
+{
+ if (reqs_drul_[STOP])
+ {
+ if (!abeam_p_)
+ reqs_drul_[STOP]->warning (_("No abbreviation beam to end"));
+ prev_start_req_ = 0;
+ finished_abeam_p_ = abeam_p_;
+ abeam_p_ = 0;
+ }
+
+ if (abeam_p_)
+ {
+ 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 ();
+ }
+
+ if (reqs_drul_[START])
+ {
+ if (abeam_p_)
+ {
+ reqs_drul_[START]->warning (_ ("Already have an abbreviation beam"));
+ return;
+ }
+
+ prev_start_req_ = reqs_drul_[START];
+
+ abeam_p_ = new Chord_tremolo;
+ announce_element (Score_element_info (abeam_p_, reqs_drul_[LEFT]));
+ }
+}
+
+void
+Chord_tremolo_engraver::do_post_move_processing ()
+{
+ reqs_drul_ [START] = 0;
+}
+
+void
+Chord_tremolo_engraver::do_pre_move_processing ()
+{
+ typeset_beam ();
+}
+
+void
+Chord_tremolo_engraver::typeset_beam ()
+{
+ if (finished_abeam_p_)
+ {
+ typeset_element (finished_abeam_p_);
+ finished_abeam_p_ = 0;
+
+ reqs_drul_[STOP] = 0;
+ }
+}
+
+void
+Chord_tremolo_engraver::do_removal_processing ()
+{
+ typeset_beam ();
+ if (abeam_p_)
+ {
+ prev_start_req_->warning (_ ("Unfinished abbreviation beam"));
+ finished_abeam_p_ = abeam_p_;
+ typeset_beam ();
+ }
+}
+
+void
+Chord_tremolo_engraver::acknowledge_element (Score_element_info i)
+{
+ if (abeam_p_)
+ {
+ if (Stem* s = dynamic_cast<Stem *> (i.elem_l_))
+ {
+ int type_i = prev_start_req_->type_i_;
+ s->flag_i_ = intlog2 (type_i) - 2;
+
+ s->beams_i_drul_[LEFT] = s->flag_i_;
+ s->beams_i_drul_[RIGHT] = s->flag_i_;
+
+ abeam_p_->multiple_i_ = s->flag_i_;
+ /*
+ abbrev gaps on all but half note
+ */
+#if 0
+ if (s->type_i () != 1)
+ {
+ int gap_i =s->flag_i_ - ((s->type_i () >? 2) - 2);
+ s->set_elt_property (beam_gap_scm_sym, gh_int2scm(gap_i));
+ }
+#else
+ if (s->type_i () != 1)
+ {
+ int gap_i =s->flag_i_ - ((s->type_i () >? 2) - 2);
+ abeam_p_->set_elt_property (beam_gap_scm_sym, gh_int2scm(gap_i));
+ }
+#endif
+
+ abeam_p_->add_stem (s);
+ }
+ }
+}
--- /dev/null
+/*
+ abbreviation-beam.cc -- implement Chord_tremolo
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+
+#include "paper-column.hh"
+#include "array.hh"
+#include "proto.hh"
+#include "chord-tremolo.hh"
+#include "misc.hh"
+#include "debug.hh"
+
+#include "molecule.hh"
+#include "leastsquares.hh"
+#include "stem.hh"
+#include "paper-def.hh"
+#include "lookup.hh"
+#include "stem-info.hh"
+
+
+
+
+Chord_tremolo::Chord_tremolo ()
+ : Beam ()
+{
+}
+
+Molecule*
+Chord_tremolo::do_brew_molecule_p () const
+{
+ return Beam::do_brew_molecule_p ();
+}
+
+void
+Chord_tremolo::do_print () const
+{
+#ifndef NPRINT
+ Beam::do_print ();
+ Spanner::do_print ();
+#endif
+}
+
+/*
+ beams to go with one stem.
+ */
+Molecule
+Chord_tremolo::stem_beams (Stem *here, Stem *next, Stem *prev) const
+{
+ /*
+ todo
+ - shorter beams (not reaching outer "stems")
+ for [:16 c4 c4] and [:16 c1 c1]
+ - centered beam on [:16 c1 c1] heads, rather than "stems"
+ */
+ return Beam::stem_beams (here, next, prev);
+}
--- /dev/null
+/*
+ colhpos.cc -- implement Column_x_positions
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+*/
+
+#include "column-x-positions.hh"
+#include "real.hh"
+#include "debug.hh"
+#include "vector.hh"
+#include "line-spacer.hh"
+
+Column_x_positions::Column_x_positions()
+{
+ energy_f_ = infinity_f;
+ satisfies_constraints_b_ = false;
+ spacer_l_ =0;
+}
+
+Column_x_positions::~Column_x_positions()
+{
+
+}
+
+void
+Column_x_positions::add_paper_column (Paper_column*c)
+{
+ cols_.push (c);
+}
+
+void
+Column_x_positions::print() const
+{
+#ifndef NPRINT
+ DOUT << "energy : " << energy_f_ << '\n';
+ DOUT << "line of " << config_.size() << " cols\n";
+ Vector v (config_);
+ DOUT << v;
+#endif
+}
+
+void
+Column_x_positions::OK() const
+{
+#ifndef NDEBUG
+ assert (config_.size() == cols_.size ());
+#endif
+}
+
+void
+Column_x_positions::set_stupid_solution(Vector v)
+{
+ energy_f_ = infinity_f;
+ config_ = v;
+}
+
+void
+Column_x_positions::stupid_solution()
+{
+ set_stupid_solution (spacer_l_->default_solution());
+}
+
+void
+Column_x_positions::solve_line()
+{
+ spacer_l_->solve (this);
+}
+
+
+void
+Column_x_positions::approximate_solve_line()
+{
+ spacer_l_->lower_bound_solution (this);
+}
+
+
*/
#include "gourlay-breaking.hh"
-#include "colhpos.hh"
+#include "column-x-positions.hh"
#include "spring-spacer.hh"
#include "debug.hh"
#include "paper-column.hh"
#include "array.hh"
#include "interval.hh"
#include "lily-proto.hh"
-#include "colhpos.hh"
+#include "column-x-positions.hh"
/**
Statistics for the number of columns calced.
--- /dev/null
+/*
+ chord-tremolo-engraver.hh -- declare Chord_tremolo_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+
+
+#ifndef Chord_tremolo_ENGRAVER_HH
+#define Chord_tremolo_ENGRAVER_HH
+
+#include "engraver.hh"
+#include "drul-array.hh"
+
+/**
+ Generate an abbreviation beam. Eat stems.
+ */
+class Chord_tremolo_engraver : public Engraver
+{
+public:
+ VIRTUAL_COPY_CONS(Translator);
+
+
+ Chord_tremolo_engraver();
+
+protected:
+ virtual void do_removal_processing();
+ virtual void do_process_requests();
+ virtual bool do_try_music (Music*);
+ virtual void acknowledge_element (Score_element_info);
+ virtual void do_pre_move_processing();
+ virtual void do_post_move_processing();
+
+private:
+ void typeset_beam ();
+ Drul_array<Chord_tremolo_req*> reqs_drul_;
+ Chord_tremolo_req* prev_start_req_;
+ Chord_tremolo* abeam_p_;
+ Chord_tremolo* finished_abeam_p_;
+};
+
+#endif // Chord_tremolo_ENGRAVER_HH
--- /dev/null
+/*
+ chord-tremolo-engraver.hh -- declare Chord_tremolo_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+
+#ifndef Chord_tremolo_HH
+#define Chord_tremolo_HH
+
+#include "beam.hh"
+
+/** a beam connects multiple stems Beam adjusts the stems its owns to
+ make sure that they reach the beam and that point in the correct
+ direction */
+class Chord_tremolo : public Beam {
+public:
+
+
+ Chord_tremolo();
+
+ VIRTUAL_COPY_CONS(Score_element);
+
+protected:
+ virtual void do_print() const;
+ virtual Molecule stem_beams (Stem *here, Stem *next, Stem *prev) const;
+ virtual Molecule* do_brew_molecule_p() const;
+};
+
+#endif // Chord_tremolo_HH
+
--- /dev/null
+/*
+ column-x-positions.hh -- part of GNU LilyPond
+
+ (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+*/
+
+#ifndef COLUMN_X_POSITIONS_HH
+#define COLUMN_X_POSITIONS_HH
+
+#include "parray.hh"
+#include "lily-proto.hh"
+
+typedef Link_array<Paper_column> Line_of_cols;
+
+struct Column_x_positions {
+ Line_spacer * spacer_l_;
+ Line_of_cols cols_;
+ Array<Real> config_;
+
+ Real energy_f_;
+ bool satisfies_constraints_b_;
+
+ void OK() const;
+ ~Column_x_positions();
+ void solve_line();
+ void approximate_solve_line();
+ /** generate a solution with no regard to idealspacings or
+ constraints. should always work */
+ void stupid_solution();
+ void set_stupid_solution (Vector);
+ Column_x_positions();
+ void add_paper_column (Paper_column*c);
+ void print() const;
+};
+
+
+#endif // COLUMN_X_POSITIONS_HH
+
-struct Abbreviation_beam;
-struct Abbreviation_beam_engraver;
-struct Abbreviation_beam_req;
struct Absolute_dynamic_req;
struct Adobe_font_char_metric;
struct Adobe_font_metric;
struct Break_align_item;
struct Break_req;
struct CHyphen_req;
+struct Chord_tremolo;
+struct Chord_tremolo_engraver;
+struct Chord_tremolo_req;
struct Cadenza_req;
struct Change_iterator;
struct Change_translator;
#ifndef SCORELINE_HH
#define SCORELINE_HH
-#include "colhpos.hh"
+#include "column-x-positions.hh"
#include "axis-group-spanner.hh"
#include "super-element.hh"
};
/**
Start / stop an abbreviation beam. */
-class Abbreviation_beam_req : public Span_req
+class Chord_tremolo_req : public Span_req
{
public:
VIRTUAL_COPY_CONS (Music);
- Abbreviation_beam_req ();
+ Chord_tremolo_req ();
virtual void do_print () const;
#ifndef P_SCORE_HH
#define P_SCORE_HH
-#include "colhpos.hh"
+#include "column-x-positions.hh"
#include "parray.hh"
#include "lily-proto.hh"
#include "music-output.hh"
#include "line-spacer.hh"
#include "cons.hh"
#include "col-info.hh"
-#include "colhpos.hh"
+#include "column-x-positions.hh"
#include "moment.hh"
Array<CHead_melodic_tuple> stopped_heads_;
Link_array<Tie> tie_p_arr_;
+ void set_melisma (bool);
protected:
virtual void do_post_move_processing ();
virtual void do_pre_move_processing ();
span_dir_ = CENTER;
}
-Abbreviation_beam_req::Abbreviation_beam_req ()
+Chord_tremolo_req::Chord_tremolo_req ()
{
type_i_ = 0;
}
void
-Abbreviation_beam_req::do_print () const
+Chord_tremolo_req::do_print () const
{
#ifndef NPRINT
DOUT << type_i_;
#include "pointer.tcc"
#include "score-column.hh"
#include "paper-def.hh"
-#include "colhpos.hh"
+#include "column-x-positions.hh"
#include "main.hh"
Vector