includedir = @includedir@
datadir = @datadir@
localedir = @localedir@
+program_prefix = @program_prefix@
+program_suffix = @program_suffix@
EXTRA_LIBES = @EXTRA_LIBES@ @LIBS@
TEX_TFMDIR = @TEX_TFMDIR@
RANLIB = @RANLIB@
\translator { \ScoreContext
%textVerticalAlignment = #0
}
-\translator { \StaffContext \consists "Staff_margin_engraver"; }
-\translator { \PianoStaffContext \consists "Staff_margin_engraver"; }
+%\translator { \StaffContext \consists "Staff_margin_engraver"; }
+%\translator { \PianoStaffContext \consists "Staff_margin_engraver"; }
+\translator { \StaffContext \consists "New_staff_margin_engraver"; }
+\translator { \PianoStaffContext \consists "New_staff_margin_engraver"; }
}}
return 0.0;
}
+
+Real
+Align_interface::center_on_element (Dimension_cache const *c)
+{
+ Score_element *me = c->element_l ();
+ Score_element *cent = unsmob_element (me->get_elt_property ("group-center-element"));
+
+ if (cent)
+ {
+ Real r = cent->relative_coordinate (me, c->axis ());
+ return -r;
+ }
+ return 0;
+}
+
/*
Hairy function to put elements where they should be. Can be tweaked
from the outside by setting minimum-space and extra-space in its
return elt_l_->dim_cache_[a]->extent_callback_l_ == group_extent_callback;
}
+Interval
+Axis_group_interface::relative_group_extent (Axis a, Score_element *common, SCM elts)
+{
+ Interval r;
+ for (SCM s = elts; gh_pair_p (s); s = gh_cdr (s))
+ {
+ Score_element * se = unsmob_element (gh_car (s));
+ Interval dims = se->extent (a);
+ if (!dims.empty_b ())
+ r.unite (dims + se->relative_coordinate (common, a));
+ }
+ return r;
+}
+
Interval
Axis_group_interface::group_extent_callback (Dimension_cache const *c)
{
Axis a = c->axis ();
Score_element * me = c->element_l ();
+ Score_element * common = me;
- Interval r;
for (SCM s = me->get_elt_property ("elements"); gh_pair_p (s); s = gh_cdr (s))
{
- SCM e=gh_car (s);
- Score_element * se = SMOB_TO_TYPE (Score_element, e);
-
- Interval dims = se->extent (a);
- if (!dims.empty_b ())
- r.unite (dims + se->relative_coordinate (me, a));
+ Score_element * se = unsmob_element (gh_car (s));
+ common = se->common_refpoint (common, a);
}
- return r;
-}
+ Real my_coord = me->relative_coordinate (common, a);
+ Interval r (relative_group_extent (a, common, me->get_elt_property ("elements")));
+ return r - my_coord;
+}
void
Axis_group_interface::set_interface ()
if (!has_interface_b ())
{
elt_l_->set_elt_property ("elements", SCM_EOL);
- elt_l_->set_elt_property ("transparent", SCM_BOOL_T);
+ elt_l_->set_elt_property ("transparent", SCM_BOOL_T); // junk this?
elt_l_->set_elt_property ("axes" , SCM_EOL);
group (elt_l_, "interfaces").add_thing (ly_symbol2scm ("Axis_group"));
}
if (!bar_p_)
{
bar_p_ = new Staff_bar;
- bar_p_->set_elt_property ("break-aligned", SCM_BOOL_T);
+ bar_p_->set_elt_property ("break-align-symbol", ly_symbol2scm ("Staff_bar"));
// urg: "" != empty...
SCM default_type = get_property ("defaultBarType");
if (gh_string_p (s))
{
String str =ly_scm2string (s);
- if (str == "bracket")
- return staff_bracket (get_bar_size ());
- else if (str == "brace")
- return staff_brace (get_bar_size ());
- else
- return compound_barline (str, get_bar_size ());
+ return compound_barline (str, get_bar_size ());
}
return Molecule ();
}
-Molecule
-Bar::staff_bracket (Real height) const
-{
- Paper_def* p= paper_l ();
- Real arc_height = p->get_var("bracket_arch_height");
- SCM at = gh_list (ly_symbol2scm ("bracket"),
- gh_double2scm (p->get_var("bracket_arch_angle")),
- gh_double2scm (p->get_var("bracket_arch_width")),
- gh_double2scm (arc_height),
- gh_double2scm (p->get_var("bracket_width")),
- gh_double2scm (height),
- gh_double2scm (p->get_var("bracket_arch_thick")),
- gh_double2scm (p->get_var("bracket_thick")),
- SCM_UNDEFINED);
-
- Real staff_space = p->get_var ("interline");
- Real h = height + 2 * arc_height;
- Box b (Interval (0, 1.5 * staff_space), Interval (-h/2, h/2));
- Molecule mol (b, at);
-
- mol.translate_axis (- mol.dim_[X_AXIS].length () / 2, X_AXIS);
- return mol;
-}
-
Molecule
Bar::compound_barline (String str, Real h) const
{
return m;
}
-/*
- ugh. Suck me plenty.
- */
-Molecule
-Bar::staff_brace (Real y) const
-{
- Real staffht = paper_l ()->get_var ("staffheight");
- int staff_size = int (rint (staffht ));
-
- // URG
- Real step = 1.0;
- int minht = 2 * staff_size;
- int maxht = 7 * minht;
- int idx = int (((maxht - step) <? y - minht) / step);
- idx = idx >? 0;
-
- SCM l = scm_eval (gh_list (ly_symbol2scm ("style-to-cmr"),
- ly_str02scm ("brace"),
- SCM_UNDEFINED));
-
- String nm = "feta-braces";
- if (l != SCM_BOOL_F)
- nm = ly_scm2string (gh_cdr (l));
- nm += to_str (staff_size);
- SCM e =gh_list (ly_symbol2scm ("char"), gh_int2scm (idx), SCM_UNDEFINED);
- SCM at = (e);
-
- at = fontify_atom (all_fonts_global_p->find_font (nm), at);
-
- Box b (Interval (0,0), Interval (-y/2, y/2));
-
- return Molecule(b, at);
-}
-
Molecule
Bar::simple_barline (Real w, Real h) const
#include "break-align-item.hh"
#include "align-interface.hh"
#include "axis-group-interface.hh"
+#include "dimension-cache.hh"
class Break_align_engraver : public Engraver
{
if (!breakable)
return ;
- SCM al = item_l->remove_elt_property ("break-aligned");
- if (!gh_boolean_p (al ) || !gh_scm2bool (al))
+ SCM align_name = item_l->remove_elt_property ("break-align-symbol");
+ if (!gh_symbol_p (align_name))
return ;
-
if (!align_l_)
{
align_l_ = new Break_align_item;
align_l_->set_elt_property ("breakable", SCM_BOOL_T);
announce_element (Score_element_info (align_l_,0));
+
+
+ Item * edge = new Item;
+ SCM edge_sym = ly_symbol2scm ("Left_edge_item");
+ edge->set_elt_property ("break-align-symbol", edge_sym);
+
+ /*
+ If the element is empty, it will be ignored in the break
+ alignment stuff.
+
+ TODO: switch off ignoring empty stuff?
+ */
+ edge->dim_cache_[X_AXIS]->set_extent_callback (Dimension_cache::point_dimension_callback);
+
+ align_l_->set_elt_property ("group-center-element", edge->self_scm_);
+
+ announce_element (Score_element_info(edge, 0));
+ column_alist_ = scm_assoc_set_x (column_alist_, edge_sym, edge->self_scm_);
}
- SCM name = ly_str02scm (inf.elem_l_->name());
- SCM s = scm_assoc (name, column_alist_);
+ SCM s = scm_assoc (align_name, column_alist_);
Item * group = 0;
Axis_group_interface (group).set_interface ();
Axis_group_interface (group).set_axes (X_AXIS,X_AXIS);
- group->set_elt_property ("origin", name);
+ group->set_elt_property ("break-align-symbol", align_name);
group->set_parent (align_l_, Y_AXIS);
announce_element (Score_element_info (group, 0));
- column_alist_ = scm_assoc_set_x (column_alist_, name, group->self_scm_);
+ column_alist_ = scm_assoc_set_x (column_alist_, align_name, group->self_scm_);
}
Axis_group_interface (group).add_element (item_l);
}
void
Break_align_item::before_line_breaking ()
{
- Direction ad = (break_status_dir() == LEFT) ? RIGHT : LEFT;
- Real interline= paper_l ()->get_var ("interline");
-
- set_elt_property ("self-alignment-X", gh_int2scm (ad));
+ if (break_status_dir() == LEFT)
+ {
+ set_elt_property ("self-alignment-X", gh_int2scm (RIGHT));
+ }
+ else
+ {
+ add_offset_callback (Align_interface::center_on_element, X_AXIS);
+ }
+
+ Real interline= paper_l ()->get_var ("interline");
Link_array<Score_element> elems;
Link_array<Score_element> all_elems
= Group_interface__extract_elements (this, (Score_element*)0,
SCM symbol_list = SCM_EOL;
Array<Real> dists;
- SCM current_origin = ly_str02scm ("");
+ SCM current_origin = ly_symbol2scm ("none");
for (int i=0; i <= elems.size (); i++)
{
Score_element *next_elt = i < elems.size ()
if (next_elt)
{
- next_origin = next_elt->get_elt_property ("origin");
+ next_origin = next_elt->get_elt_property ("break-align-symbol");
next_origin =
(next_origin == SCM_UNDEFINED)
- ? ly_str02scm ("")
+ ? ly_symbol2scm ("none")
: next_origin;
}
else
- next_origin = ly_str02scm ("begin-of-note");
+ next_origin = ly_symbol2scm ("begin-of-note");
SCM extra_space
= scm_eval (scm_listify (ly_symbol2scm ("break-align-spacer"),
- current_origin, next_origin, SCM_UNDEFINED));
+ ly_quote_scm (current_origin),
+ ly_quote_scm (next_origin),
+ SCM_UNDEFINED));
SCM symbol = gh_car (extra_space);
Real spc = gh_scm2double (SCM_CADR(extra_space));
spc *= interline;
/*
Hint the spacing engine how much space to put in.
-
The pairs are in the format of an interval (ie. CAR < CDR).
*/
column_l ()->set_elt_property ("extra-space",
if(breathing_sign_req_l_)
{
breathing_sign_p_ = new Breathing_sign;
- breathing_sign_p_->set_elt_property ("break-aligned", SCM_BOOL_T);
+ breathing_sign_p_->set_elt_property ("break-align-symbol",
+ ly_symbol2scm ("Breathing_sign"));
Staff_symbol_referencer_interface st (breathing_sign_p_);
st.set_interface ();
{
Clef_item *c= new Clef_item;
c->set_elt_property ("breakable", SCM_BOOL_T);
- c->set_elt_property ("break-aligned", SCM_BOOL_T);
+ c->set_elt_property ("break-align-symbol", ly_symbol2scm ("Clef_item"));
announce_element (Score_element_info (c, clef_req_l_));
Staff_symbol_referencer_interface si(c);
int get_count (Score_element*)const;
void set_interface ();
bool has_interface_b ();
+ static Real center_on_element (Dimension_cache const *c);
};
#endif /* ALIGN_INTERFACE_HH */
Axis_group_interface (Score_element*);
static Interval group_extent_callback (Dimension_cache const*);
+ static Interval relative_group_extent (Axis, Score_element * common, SCM list);
void add_element (Score_element*);
void set_axes (Axis,Axis);
Link_array<Score_element> get_children ();
bool has_interface_b ();
void set_interface ();
+
};
#endif /* AXIS_GROUP_INTERFACE_HH */
VIRTUAL_COPY_CONS(Score_element);
Bar();
- Molecule staff_bracket (Real height) const;
- Molecule staff_brace (Real height) const;
Molecule compound_barline (String, Real height) const;
Molecule simple_barline (Real wid, Real height) const;
#include "item.hh"
-/// align breakable items (clef, bar, etc.)
+/**
+ align breakable items (clef, bar, etc.)
+
+ Properties:
+
+ break-align-symbol -- the index in the spacing table (symbol) of
+ the to be aligned item.
+
+
+ TODO: remove this as a class, and make interface.
+ */
+
class Break_align_item : public Item
{
protected:
void evaluate_empty ();
static Interval width_callback(Dimension_cache const*) ;
- static Interval height_callback(Dimension_cache const*) ;
virtual Real get_bar_size () const;
virtual void before_line_breaking ();
--- /dev/null
+/*
+ System-start-delimiter.hh -- declare System_start_delimiter
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+
+#ifndef SYSTEM_START_DELIMITER_HH
+#define SYSTEM_START_DELIMITER_HH
+
+#include "spanner.hh"
+
+/*
+ Braces/brackets across staffs.
+ */
+class System_start_delimiter : public Spanner
+{
+public:
+ System_start_delimiter ();
+ VIRTUAL_COPY_CONS (Score_element);
+protected:
+ virtual Molecule do_brew_molecule () const;
+ Molecule staff_bracket (Real) const;
+ Molecule staff_brace (Real) const;
+ Molecule simple_bar (Real) const;
+};
+
+#endif /* SYSTEM_START_DELIMITER_HH */
+
public:
SCM get_property (SCM name_sym) const;
void set_property (String var_name, SCM value);
-
+ Translator_group *where_defined (SCM name_sym) const;
String id_str_;
void add_last_element (String s);
--- /dev/null
+/*
+ new-staff-margin-engraver.cc -- implement Instrument_name_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+
+#include "engraver.hh"
+#include "text-item.hh"
+#include "bar.hh"
+#include "span-bar.hh"
+
+class Instrument_name_engraver : public Engraver
+{
+ Text_item *text_;
+
+ void create_text (SCM s);
+public:
+ VIRTUAL_COPY_CONS(Translator);
+ Instrument_name_engraver ();
+
+ virtual void acknowledge_element (Score_element_info);
+ virtual void do_pre_move_processing ();
+};
+
+ADD_THIS_TRANSLATOR(Instrument_name_engraver);
+
+Instrument_name_engraver::Instrument_name_engraver ()
+{
+ text_ = 0;
+}
+
+
+void
+Instrument_name_engraver::do_pre_move_processing ()
+{
+ if (text_)
+ {
+ typeset_element (text_);
+ text_ = 0;
+ }
+}
+
+void
+Instrument_name_engraver::create_text (SCM txt)
+{
+ if(!text_)
+ {
+ text_ = new Text_item;
+ text_->set_elt_property ("text", txt);
+ text_->set_elt_property ("breakable", SCM_BOOL_T);
+
+ /*
+ TODO: use more lispish names for break-align-symbols
+ */
+ text_->set_elt_property ("break-align-symbol", ly_symbol2scm ("Instrument_name"));
+ text_->set_elt_property ("visibility-lambda",
+ scm_eval (ly_symbol2scm ("begin-of-line-visible")));
+
+ announce_element (Score_element_info (text_,0));
+ }
+}
+
+void
+Instrument_name_engraver::acknowledge_element (Score_element_info i)
+{
+ SCM s = get_property ("instrument");
+
+ if (now_mom () > Moment (0))
+ s = get_property ("instr");
+
+ if (gh_string_p (s))
+ {
+ if (Bar* b= dynamic_cast<Bar*> (i.elem_l_))
+ {
+ create_text (s);
+ if (Span_bar* s= dynamic_cast<Span_bar*> (b))
+ {
+ text_->set_parent (s, Y_AXIS);
+ }
+ }
+ }
+}
+
+
+
+
item_p_ = new Key_item;
Staff_symbol_referencer_interface st (item_p_);
st.set_interface ();
+
- item_p_->set_elt_property ("break-aligned", SCM_BOOL_T); // ugh
-
+ item_p_->set_elt_property ("break-align-symbol", ly_symbol2scm ("Key_item"));
item_p_->set_elt_property ("multi-octave",
gh_bool2scm (key_.multi_octave_b_));
ugh
*/
Chord chord = to_chord (tonic, add_arr_p, sub_arr_p, inversion_p, bass_p);
+ inversion_p = 0;
+ bass_p = 0;
Tonic_req* t = new Tonic_req;
t->pitch_ = tonic;
v->add_music (t);
//urg
- if (inversion_p
- && Chord::find_notename_i (&chord.pitch_arr_, *inversion_p) > 0)
+ if (chord.inversion_b_
+ && Chord::find_notename_i (&chord.pitch_arr_, chord.inversion_pitch_) > 0)
{
Inversion_req* i = new Inversion_req;
- i->pitch_ = *inversion_p;
+ i->pitch_ = chord.inversion_pitch_;
v->add_music (i);
}
- if (bass_p)
+ if (chord.bass_b_)
{
Bass_req* b = new Bass_req;
- b->pitch_ = *bass_p;
+ b->pitch_ = chord.bass_pitch_;
v->add_music (b);
}
Dimension_cache const * d = dim_cache_[a];
Interval ext = d->get_dim ();
-
+ if (empty_b (a))
+ return ext;
+
SCM extra = get_elt_property (a == X_AXIS ? "extra-extent-X"
: "extra-extent-Y");
return 0.0;
}
+
+
Real
directed_round (Real f, Direction d)
{
if (rc->musical_b () && to_boolean (rc->get_elt_property ("contains-grace")))
right_dist *= paper_l ()->get_var ("before_grace_spacing_factor");
-
- s.distance_f_ = left_distance + right_dist;
+ s.distance_f_ = left_distance + right_dist;
Real stretch_dist = 0.;
if (gh_number_p (stretch_hint))
-#include "base-span-bar-engraver.hh"
+/*
+ span-bar-grav.cc -- implement Span_bar_engraver
+ source file of the GNU LilyPond music typesetter
-class Span_bar_engraver : public Base_span_bar_engraver
+ (c) 1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+*/
+
+#include "dimension-cache.hh"
+#include "lily-guile.hh"
+#include "span-bar.hh"
+#include "engraver.hh"
+
+/**
+
+ Make bars that span multiple "staffs". Catch bars, and span a
+ Span_bar over them if we find more than 2 bars. Vertical alignment
+ of staffs changes the appearance of spanbars. It is up to the
+ aligner (Vertical_align_engraver, in this case, to add extra
+ dependencies to the spanbars.
+
+ */
+class Span_bar_engraver : public Engraver
{
+ Span_bar * spanbar_p_;
+ Link_array<Bar> bar_l_arr_;
+
public:
- Span_bar_engraver ();
- VIRTUAL_COPY_CONS (Translator);
+ VIRTUAL_COPY_CONS(Translator);
+ Span_bar_engraver();
+protected:
+ virtual void acknowledge_element (Score_element_info);
+ virtual void do_pre_move_processing();
+ virtual Span_bar* get_span_bar_p() const;
};
-Span_bar_engraver::Span_bar_engraver ()
+Span_bar_engraver::Span_bar_engraver()
+{
+ spanbar_p_ =0;
+}
+
+Span_bar*
+Span_bar_engraver::get_span_bar_p() const
+{
+ return new Span_bar;
+}
+
+
+void
+Span_bar_engraver::acknowledge_element (Score_element_info i)
{
- use_priority_b_ = false;
+ int depth = i.origin_trans_l_arr (this).size();
+ if (depth > 1
+ && dynamic_cast<Bar *> (i.elem_l_))
+ {
+ bar_l_arr_.push (dynamic_cast<Bar *> (i.elem_l_));
+
+ if (bar_l_arr_.size() >= 2 && !spanbar_p_)
+ {
+ spanbar_p_ = get_span_bar_p();
+ spanbar_p_->set_parent (bar_l_arr_[0], Y_AXIS);
+
+ /*
+ UGH. UGH UUHGK GUHG G
+ */
+ String visnam = String(name()) + "-visibility";
+
+ spanbar_p_->set_elt_property ("visibility-lambda",
+ scm_eval (ly_symbol2scm (visnam.ch_C())));
+
+ spanbar_p_->set_parent (bar_l_arr_[0], X_AXIS);
+ announce_element (Score_element_info (spanbar_p_,0));
+ if (!gh_string_p (spanbar_p_->get_elt_property ("glyph")))
+ spanbar_p_-> set_elt_property ("glyph",
+ bar_l_arr_[0]->get_elt_property ("glyph"));
+ }
+ }
+}
+
+void
+Span_bar_engraver::do_pre_move_processing()
+{
+ if (spanbar_p_)
+ {
+ for (int i=0; i < bar_l_arr_.size() ; i++)
+ spanbar_p_->add_bar (bar_l_arr_[i]);
+ typeset_element (spanbar_p_);
+ spanbar_p_ =0;
+ }
+ bar_l_arr_.set_size (0);
}
+
+
ADD_THIS_TRANSLATOR(Span_bar_engraver);
+
+
+
#include "paper-def.hh"
#include "molecule.hh"
#include "warn.hh"
+#include "axis-group-interface.hh"
#include "group-interface.hh"
-
void
Span_bar::add_bar (Score_element*b)
{
Span_bar* s= dynamic_cast<Span_bar*> (c->element_l ());
String gl = ly_scm2string (s->get_elt_property ("glyph"));
- /*urg.
+ /*
+ urg.
*/
Molecule m = s->compound_barline (gl, 40 PT);
Bar::before_line_breaking ();
evaluate_empty ();
-
- // set_empty (false, Y_AXIS); // a hack to make mark scripts work.
}
void
Span_bar::after_line_breaking ()
{
Bar::after_line_breaking ();
- SCM s = get_elt_property ("collapse-height");
- if (gh_number_p (s)
- && get_spanned_interval ().length () < gh_scm2double (s))
- {
- set_elt_property ("transparent", SCM_BOOL_T);
- set_empty (X_AXIS);
- set_empty (Y_AXIS);
- }
-
Interval i (get_spanned_interval ());
translate_axis (i.center (), Y_AXIS);
}
Interval
Span_bar::get_spanned_interval () const
{
- Interval y_int;
-
- for (SCM s = get_elt_property ("elements"); gh_pair_p (s); s = gh_cdr (s))
- {
- Score_element *bar = unsmob_element ( gh_car (s));
-
- if (!bar)
- continue;
-
- Score_element*common = common_refpoint (bar, Y_AXIS);
-
- Interval iv (bar->extent(Y_AXIS));
- if (!iv.empty_b ())
- {
- Real y = bar->relative_coordinate (common, Y_AXIS)
- - relative_coordinate (common, Y_AXIS);
-
- y_int.unite (y + iv);
- }
- }
-
- return y_int;
+ return Axis_group_interface::group_extent_callback (dim_cache_[Y_AXIS]);
}
-Interval
-Span_bar::height_callback (Dimension_cache const *c)
-{
- Span_bar * s= dynamic_cast<Span_bar*> (c->element_l ());
- return s->get_spanned_interval ();
-}
Real
Span_bar::get_bar_size () const
{
group (this).set_interface ();
dim_cache_[X_AXIS]->set_extent_callback (width_callback);
- dim_cache_[Y_AXIS]->set_extent_callback (height_callback);
+ dim_cache_[Y_AXIS]->set_extent_callback (Axis_group_interface::group_extent_callback);
}
-/*
- span-score-bar-engraver.cc -- implement Span_score_bar_engraver,
- Piano_bar_engraver and Staff_group_bar_engraver
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-#include "span-bar.hh"
-#include "span-score-bar-engraver.hh"
-#include "paper-def.hh"
-#include "dimension-cache.hh"
-
-Span_bar*
-Span_score_bar_engraver::get_span_bar_p () const
-{
- Span_bar*s = new Span_bar;
- s->set_elt_property ("glyph", gh_str02scm ("scorebar"));
- s->set_elt_property ("break-aligned",SCM_BOOL_T);
-
- return s;
-}
-
-
-Span_score_bar_engraver::Span_score_bar_engraver ()
-{
- use_priority_b_ = true;
-}
-
-Span_bar*
-Piano_bar_engraver::get_span_bar_p () const
-{
- Span_bar *s= new Span_bar;
- s->set_empty (X_AXIS);
- s->set_elt_property ("glyph", gh_str02scm ("brace"));
- return s;
-}
-
-Span_bar*
-Staff_group_bar_engraver::get_span_bar_p () const
-{
- Span_bar *s= new Span_bar;
- s->set_empty (X_AXIS);
- s->set_elt_property ("glyph", gh_str02scm ("bracket"));
-
- SCM collapse = get_property ("bracketCollapseHeight");
- if (gh_number_p (collapse))
- s->set_elt_property ("collapse-height", collapse);
- else
- s->set_elt_property ("collapse-height", gh_double2scm (1));
-
- return s;
-}
-
-void
-Staff_group_bar_engraver::acknowledge_element (Score_element_info i)
-{
- Base_span_bar_engraver::acknowledge_element (i);
-
- /*
- UGH. This has to go into the backend.
- */
- if (Span_bar * b = dynamic_cast<Span_bar *> (i.elem_l_))
- {
- SCM gl = b->get_elt_property ("glyph");
- if (gh_string_p (gl) && ly_scm2string (gl) == "brace")
- b->translate_axis ( -paper_l ()->get_var ("interline"),
- X_AXIS); // ugh
- }
-}
-
-ADD_THIS_TRANSLATOR (Piano_bar_engraver);
-ADD_THIS_TRANSLATOR (Staff_group_bar_engraver);
-ADD_THIS_TRANSLATOR (Span_score_bar_engraver);
-
* merge with/derive from/add functionality to Bar_script_engraver
*/
-/**
- Hang on left edge of staff to provide suppor for simple items.
- */
-class Left_edge_item : public Item
-{
-public:
- VIRTUAL_COPY_CONS (Score_element);
-};
/**
put (instrument) text to left of line
private:
String type_;
Text_item* text_p_;
- Left_edge_item* left_edge_p_;
+ Item* left_edge_p_;
void create_text (SCM);
};
create_text (s);
if (Span_bar* s= dynamic_cast<Span_bar*> (b))
{
- assert (text_p_);
text_p_->set_parent (s, Y_AXIS);
}
}
if (!text_p_)
{
assert (!left_edge_p_);
- Left_edge_item* l = new Left_edge_item;
-
- l->set_elt_property ("breakable", SCM_BOOL_T);
- l->set_elt_property ("break-aligned", SCM_BOOL_T);
+ left_edge_p_ = new Item;
+ left_edge_p_->set_elt_property ("breakable", SCM_BOOL_T);
+ left_edge_p_->set_elt_property ("break-align-symbol", ly_symbol2scm ("Left_edge_item"));
- announce_element (Score_element_info (l, 0));
+ announce_element (Score_element_info (left_edge_p_, 0));
- Staff_symbol_referencer_interface sl (l);
+ Staff_symbol_referencer_interface sl (left_edge_p_);
sl.set_interface ();
- left_edge_p_ = l;
Text_item* t = new Text_item;
t->set_elt_property ("self-alignment-Y", gh_int2scm (0));
t->add_offset_callback (Side_position_interface::aligned_on_self, Y_AXIS);
- t->set_parent (l, X_AXIS);
- t->set_parent (l, Y_AXIS);
+ t->set_parent (left_edge_p_, X_AXIS);
+ t->set_parent (left_edge_p_, Y_AXIS);
// 'just to be sure': see Clef_item::do_add_processing
- l->add_dependency (t);
+ left_edge_p_->add_dependency (t);
/*
else
{
side_position (t).set_axis (X_AXIS);
- side_position (t).add_support (l);
+ side_position (t).add_support (left_edge_p_);
Direction d;
if (isdir_b (s))
scm_eval (ly_symbol2scm ("begin-of-line-visible")));
typeset_element (text_p_);
text_p_ = 0;
- assert (left_edge_p_);
+
typeset_element (left_edge_p_);
left_edge_p_ = 0;
}
--- /dev/null
+/*
+ system-start-delimiter-engraver.cc -- implement System_start_delimiter_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+
+
+#include "system-start-delimiter.hh"
+#include "engraver.hh"
+#include "staff-symbol.hh"
+#include "group-interface.hh"
+#include "paper-column.hh"
+#include "paper-def.hh"
+
+/*
+ TODO: rename this to system-open-engraver (or whatever.)
+
+ */
+class System_start_delimiter_engraver : public Engraver
+{
+public:
+ VIRTUAL_COPY_CONS(Translator);
+ System_start_delimiter_engraver();
+
+ Spanner * spanbar_;
+protected:
+
+ virtual void acknowledge_element (Score_element_info);
+ virtual void do_creation_processing ();
+ virtual void do_removal_processing ();
+};
+
+ADD_THIS_TRANSLATOR(System_start_delimiter_engraver);
+
+
+void
+System_start_delimiter_engraver::acknowledge_element (Score_element_info inf)
+{
+ if (dynamic_cast<Staff_symbol*> (inf.elem_l_))
+ {
+ /*
+ don't add as Axis_group_interface (spanbar_).add_element (),
+ because that would set the parent as well */
+
+ Group_interface (spanbar_).add_element (inf.elem_l_);
+ }
+ else if (System_start_delimiter * b = dynamic_cast<System_start_delimiter *> (inf.elem_l_))
+ {
+ SCM gl = b->get_elt_property ("glyph");
+ SCM my_gl = get_property ("spanBarGlyph");
+
+ /*
+ UGH UGH
+ */
+ if (gh_symbol_p (gl) && gl == ly_symbol2scm ("brace")
+ && gh_symbol_p (my_gl) && my_gl == ly_symbol2scm ("bracket"))
+ b->translate_axis ( -paper_l ()->get_var ("interline"), X_AXIS); // ugh
+ }
+
+}
+
+System_start_delimiter_engraver::System_start_delimiter_engraver()
+{
+ spanbar_ = 0;
+}
+
+void
+System_start_delimiter_engraver::do_creation_processing()
+{
+ spanbar_ = new System_start_delimiter;
+ spanbar_->set_bound (LEFT, get_staff_info ().command_pcol_l ());
+ announce_element (Score_element_info (spanbar_,0));
+}
+
+void
+System_start_delimiter_engraver::do_removal_processing ()
+{
+ SCM s = get_property ("systemStartDelimiterGlyph");
+ if (gh_symbol_p (s))
+ {
+ spanbar_->set_elt_property ("glyph", s);
+ }
+
+ // ugh, should have naming without bracket
+ SCM collapse = get_property ("bracketCollapseHeight");
+ if (gh_number_p (collapse))
+ spanbar_->set_elt_property ("collapse-height", collapse);
+ else
+ spanbar_->set_elt_property ("collapse-height", gh_double2scm (1));
+
+ spanbar_->set_bound (RIGHT, get_staff_info ().command_pcol_l ());
+ typeset_element (spanbar_);
+}
+
--- /dev/null
+/*
+ system-start-delimiter.cc -- implement System_start_delimiter
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+#include <math.h>
+
+#include "system-start-delimiter.hh"
+#include "paper-def.hh"
+#include "molecule.hh"
+#include "axis-group-interface.hh"
+#include "lookup.hh"
+#include "all-font-metrics.hh"
+
+Molecule
+System_start_delimiter::staff_bracket (Real height) const
+{
+ Paper_def* p= paper_l ();
+ Real arc_height = p->get_var("bracket_arch_height");
+ SCM at = gh_list (ly_symbol2scm ("bracket"),
+ gh_double2scm (p->get_var("bracket_arch_angle")),
+ gh_double2scm (p->get_var("bracket_arch_width")),
+ gh_double2scm (arc_height),
+ gh_double2scm (p->get_var("bracket_width")),
+ gh_double2scm (height),
+ gh_double2scm (p->get_var("bracket_arch_thick")),
+ gh_double2scm (p->get_var("bracket_thick")),
+ SCM_UNDEFINED);
+
+ Real staff_space = p->get_var ("interline");
+ Real h = height + 2 * arc_height;
+ Box b (Interval (0, 1.5 * staff_space), Interval (-h/2, h/2));
+ Molecule mol (b, at);
+
+ mol.translate_axis (- mol.dim_[X_AXIS].length () / 2, X_AXIS);
+ return mol;
+}
+
+System_start_delimiter::System_start_delimiter ()
+{
+ set_empty (Y_AXIS);
+}
+
+Molecule
+System_start_delimiter::simple_bar (Real h) const
+{
+ Real w = paper_l ()->get_var ("barthick_score");
+ return lookup_l ()->filledbox (Box (Interval(0,w), Interval(-h/2, h/2)));
+}
+
+
+Molecule
+System_start_delimiter::do_brew_molecule ()const
+{
+ Interval ext = Axis_group_interface::group_extent_callback (dim_cache_[Y_AXIS]);
+ Real l = ext.length ();
+ Molecule m;
+
+ SCM s = get_elt_property ("collapse-height");
+ if (gh_number_p (s) && l < gh_scm2double (s))
+ {
+ System_start_delimiter * me = (System_start_delimiter*)this;
+ me->set_elt_property ("transparent", SCM_BOOL_T);
+ me->set_empty (X_AXIS);
+ me->set_empty (Y_AXIS);
+ return m;
+ }
+
+
+ s = get_elt_property ("glyph");
+ if (gh_symbol_p (s) && s == ly_symbol2scm ("bracket"))
+ m = staff_bracket (l);
+ else if (gh_symbol_p (s) && s == ly_symbol2scm ("brace"))
+ m = staff_brace (l);
+ else
+ m = simple_bar (l);
+
+
+ m.translate_axis (ext.center (), Y_AXIS);
+ return m;
+}
+
+/*
+ ugh. Suck me plenty.
+ */
+Molecule
+System_start_delimiter::staff_brace (Real y) const
+{
+ Real staffht = paper_l ()->get_var ("staffheight");
+ int staff_size = int (rint (staffht ));
+
+ // URG
+ Real step = 1.0;
+ int minht = 2 * staff_size;
+ int maxht = 7 * minht;
+ int idx = int (((maxht - step) <? y - minht) / step);
+ idx = idx >? 0;
+
+ SCM l = scm_eval (gh_list (ly_symbol2scm ("style-to-cmr"),
+ ly_str02scm ("brace"),
+ SCM_UNDEFINED));
+
+ String nm = "feta-braces";
+ if (l != SCM_BOOL_F)
+ nm = ly_scm2string (gh_cdr (l));
+ nm += to_str (staff_size);
+ SCM e =gh_list (ly_symbol2scm ("char"), gh_int2scm (idx), SCM_UNDEFINED);
+ SCM at = (e);
+
+ at = fontify_atom (find_font (nm), at);
+
+ Box b (Interval (0,0), Interval (-y/2, y/2));
+
+ return Molecule(b, at);
+}
+
time_signature_p_->set_elt_property ("fraction",
gh_cons (gh_int2scm (req->beats_i_),
gh_int2scm (req->one_beat_i_)));
- time_signature_p_->set_elt_property ("break-aligned", SCM_BOOL_T);
+ time_signature_p_->set_elt_property ("break-align-symbol", ly_symbol2scm( "Time_signature"));
}
{
bar_req_l_ = 0;
Timing_translator::do_post_move_processing ();
+
}
bool
return Timing_translator::do_try_music (m);
}
+#if 0
+String
+Timing_engraver::do_process_music ()
+{
+ if (gh_string_p (get_property ("barType")))
+ ;
+ else if (!now_mom ())
+ {
+ daddy_trans_l_->set_property ("barType", ly_str02scm ("|"));
+ }
+ else
+
+ {
+ }
+}
+#endif
String
}
}
+Translator_group*
+Translator_group::where_defined (SCM sym) const
+{
+ if (properties_dict_.elem_b (sym))
+ {
+ return (Translator_group*)this;
+ }
+
+ return (daddy_trans_l_) ? daddy_trans_l_->where_defined (sym) : 0;
+}
+
SCM
Translator_group::get_property (SCM sym) const
{
{
properties_dict_.set (ly_symbol2scm (id.ch_C()), val);
}
+
%{
- The Staff_margin_engraver puts the name of the instrument
+ The Instrument_name_engraver puts the name of the instrument
(\property Staff.instrument; Staff.instr for subsequent lines)
to the left of a staff.
Usually, you only want this in the full score, not in the parts.
- \consists "Staff_margin_engraver";
+ \consists "Instrument_name_engraver";
%}
defaultClef = #"treble"
\translator {
\type "Engraver_group_engraver";
\name ChoirStaff;
- alignmentReference = \center;
- \consists "Staff_group_bar_engraver";
+ alignmentReference = \center;
+ \consists "System_start_delimiter_engraver";
+ systemStartDelimiterGlyph = #'bracket
+
\accepts "Staff";
\type "Engraver_group_engraver";
\name GrandStaff;
\consists "Span_bar_engraver";
- \consists "Piano_bar_engraver";
+ \consists "System_start_delimiter_engraver";
+ systemStartDelimiterGlyph = #'brace
+
\consists "Property_engraver";
Generic_property_list = #generic-grand-staff-properties
\accepts "Staff";
\type "Engraver_group_engraver";
\consists "Span_bar_engraver";
\consists "Output_property_engraver";
- \consists "Staff_group_bar_engraver";
+ \consists "System_start_delimiter_engraver";
+ systemStartDelimiterGlyph = #'bracket
+
+
+ \consistsend "Axis_group_engraver" ;
+
\name StaffGroup;
\accepts "Staff";
\StaffContext
\remove "Axis_group_engraver";
\consistsend "Hara_kiri_engraver";
- \consists "Staff_margin_engraver";
+ \consists "Instrument_name_engraver";
\accepts "Voice";
};
%{
\consists "Output_property_engraver";
%bracketCollapseHeight = #10 % \pt
- \consists "Span_score_bar_engraver";
+ \consists "System_start_delimiter_engraver";
+
% \consists "Score_priority_engraver";
\consists "Break_align_engraver";
breakAlignOrder = #'(
- "Left_edge_item"
- "Span_bar"
- "Breathing_sign"
- "Clef_item"
- "Key_item"
- "Staff_bar"
- "Time_signature"
+ Instrument_name
+ Left_edge_item
+ Span_bar
+ Breathing_sign
+ Clef_item
+ Key_item
+ Staff_bar
+ Time_signature
)
\consists "Spacing_engraver";
\consists "Vertical_align_engraver";
markVisibilityFunction = #end-of-line-invisible
barNumberVisibilityFunction = #begin-of-line-visible
- marginVisibilityFunction = #begin-of-line-visible
};
\translator { \ScoreContext }
bin/convert-mudela\
bin/mudela-book\
bin/ly2dvi\
- bin/lilypond$(DOTEXE)\
- bin/mi2mu$(DOTEXE)\
+ bin/$(program_prefix)lilypond$(program_suffix)\
+ bin/$(program_prefix)mi2mu$(program-suffix)\
info/lilypond.info\
man/man1/mi2mu.1\
man/man1/lilypond.1\
%prep
%setup
+
%build
-#./configure --disable-checking --disable-debugging --enable-printing --prefix=/usr --disable-optimise --enable-shared
+
%{configure} --disable-checking --disable-debugging --enable-printing --prefix=%{_prefix} --disable-optimise --enable-shared
+
make all
+
ln -s %{_prefix}/share/texmf/fonts/tfm/public/cm/ tfm
# urg
mkdir -p out/examples/
tar -cf - input/ | tar -C out/examples/ -xf- || true
+%ifos cygwin
+%{fix_suffixes}
+%endif
+
%post
touch /tmp/.lilypond-install
# hairy to hook it in (possibly non-existing) emacs
%doc mudela-mode.el
+%ifnos cygwin
%{_prefix}/bin/abc2ly
%{_prefix}/bin/convert-mudela
%{_prefix}/bin/mudela-book
%{_prefix}/bin/ly2dvi
%{_prefix}/bin/lilypond
%{_prefix}/bin/midi2ly
+%else
+%{_prefix}/bin
+%endif
+
%{_prefix}/man/man1/midi2ly.1
%{_prefix}/man/man1/lilypond.1
%{_prefix}/man/man1/mudela-book.1
package\
PATHSEP\
PERL\
+ program_prefix\
+ program_suffix\
PYTHON\
SHELL\
TOPLEVEL_VERSION\
step-bindir\
- abs-step-bindir\
-
;; Score_span_bars are only visible at start of line
;; i.e. if break_dir == RIGHT == 1
(define Span_bar_engraver-visibility begin-of-line-invisible)
-(define Base_span_bar_engraver-visibility begin-of-line-invisible)
(define mark-visibility end-of-line-invisible)
-(define Span_score_bar_engraver-visibility begin-of-line-visible)
-(define Piano_bar_engraver-visibility begin-of-line-visible)
-(define Staff_group_bar_engraver-visibility begin-of-line-visible)
;; Spacing constants for prefatory matter.
;;
;; (Measured in staff space)
(define space-alist
'(
- (("" "Left_edge_item") . (extra-space -15.0))
- (("" "Clef_item") . (minimum-space 1.0))
- (("" "Staff_bar") . (minimum-space 0.0))
- (("" "Clef_item") . (minimum-space 1.0))
- (("" "Key_item") . (minimum-space 0.5))
- (("" "Span_bar") . (extra-space 0.0))
- (("" "Time_signature") . (extra-space 0.0))
- (("" "begin-of-note") . (minimum-space 1.5))
- (("Clef_item" "Key_item") . (minimum-space 4.0))
- (("Key_item" "Time_signature") . (extra-space 1.0))
- (("Clef_item" "Time_signature") . (minimum-space 3.5))
- (("Staff_bar" "Clef_item") . (minimum-space 1.0))
- (("Clef_item" "Staff_bar") . (minimum-space 3.7))
- (("Time_signature" "Staff_bar") . (minimum-space 2.0))
- (("Key_item" "Staff_bar") . (extra-space 1.0))
- (("Span_bar" "Clef_item") . (extra-space 1.0))
- (("Clef_item" "Span_bar") . (minimum-space 3.7))
- (("Time_signature" "Span_bar") . (minimum-space 2.0))
- (("Key_item" "Span_bar") . (minimum-space 2.5))
- (("Staff_bar" "Time_signature") . (minimum-space 1.5)) ;double check this.
- (("Time_signature" "begin-of-note") . (extra-space 2.0)) ;double check this.
- (("Key_item" "begin-of-note") . (extra-space 2.5))
- (("Staff_bar" "begin-of-note") . (extra-space 1.0))
- (("Clef_item" "begin-of-note") . (minimum-space 5.0))
- (("" "Breathing_sign") . (minimum-space 0.0))
- (("Breathing_sign" "Key_item") . (minimum-space 1.5))
- (("Breathing_sign" "begin-of-note") . (minimum-space 1.0))
- (("Breathing_sign" "Staff_bar") . (minimum-space 1.5))
- (("Breathing_sign" "Clef_item") . (minimum-space 2.0))
+ ((none Instrument_name) . (extra-space 1.0))
+ ((Instrument_name Left_edge_item) . (extra-space 1.0))
+ ((Left_edge_item Clef_item) . (extra-space 1.0))
+ ((none Left_edge_item) . (extra-space 0.0))
+ ((Left_edge_item Staff_bar) . (extra-space 0.0))
+; ((none Left_edge_item) . (extra-space -15.0))
+; ((none Left_edge_item) . (extra-space -15.0))
+ ((none Clef_item) . (minimum-space 1.0))
+ ((none Staff_bar) . (minimum-space 0.0))
+ ((none Clef_item) . (minimum-space 1.0))
+ ((none Key_item) . (minimum-space 0.5))
+ ((none Time_signature) . (extra-space 0.0))
+ ((none begin-of-note) . (minimum-space 1.5))
+ ((Clef_item Key_item) . (minimum-space 4.0))
+ ((Key_item Time_signature) . (extra-space 1.0))
+ ((Clef_item Time_signature) . (minimum-space 3.5))
+ ((Staff_bar Clef_item) . (minimum-space 1.0))
+ ((Clef_item Staff_bar) . (minimum-space 3.7))
+ ((Time_signature Staff_bar) . (minimum-space 2.0))
+ ((Key_item Staff_bar) . (extra-space 1.0))
+ ((Staff_bar Time_signature) . (minimum-space 1.5)) ;double check this.
+ ((Time_signature begin-of-note) . (extra-space 2.0)) ;double check this.
+ ((Key_item begin-of-note) . (extra-space 2.5))
+ ((Staff_bar begin-of-note) . (extra-space 1.0))
+ ((Clef_item begin-of-note) . (minimum-space 5.0))
+ ((none Breathing_sign) . (minimum-space 0.0))
+ ((Breathing_sign Key_item) . (minimum-space 1.5))
+ ((Breathing_sign begin-of-note) . (minimum-space 1.0))
+ ((Breathing_sign Staff_bar) . (minimum-space 1.5))
+ ((Breathing_sign Clef_item) . (minimum-space 2.0))
)
)
-
+
+;; (define (ly-warn s) (error s))
(define (break-align-spacer this next)
- (let ((entry (assoc `(,this ,next) space-alist)))
+ (let ((entry (assoc (list this next) space-alist)))
(if entry
(cdr entry)
(begin (ly-warn (string-append "Unknown spacing pair `" this "', `" next "'"))
fi
stepmake=`echo ${stepmake} | sed "s!\\\${prefix}!$presome!"`
+ # urg, how is this supposed to work?
+ if test "$program_prefix" = "NONE"; then
+ program_prefix=
+ fi
+ if test "$program_suffix" = "NONE"; then
+ program_suffix=
+ fi
+
AC_MSG_CHECKING(Package)
if test "x$PACKAGE" = "xSTEPMAKE"; then
AC_MSG_RESULT(Stepmake package!)
LN=cp # hard link does not work under cygnus-nt
LN_S='cp -r' # symbolic link does not work for native nt
ZIP="zip -r -9" #
- DOTEXE=.exe
+ program_suffix=.exe
# urg
# DIRSEP='\\'
# PATHSEP=';'
ZIP="zip -r -9"
INSTALL="\$(SHELL) \$(stepdir)/../bin/install-sh -c"
fi
- AC_SUBST(DOTEXE)
+ AC_SUBST(program_prefix)
+ AC_SUBST(program_suffix)
AC_SUBST(ZIP)
AC_SUBST(LN)
AC_SUBST(LN_S)
installexe: all
-$(INSTALL) -d $(bindir)
$(foreach a, $(EXECUTABLES), \
- $(INSTALL) -m 755 $(outdir)/$(a) $(bindir)/$(a)$(DOTEXE) && \
- strip $(bindir)/$(a)$(DOTEXE) && ) true
+ $(INSTALL) -m 755 $(outdir)/$(a) \
+ $(bindir)/$(program_prefix)$(a)$(program_suffix) && \
+ strip $(bindir)/$(program_prefix)$(a)$(program_suffix) && ) true
$(foreach a, $(SEXECUTABLES), \
$(INSTALL) -m 755 $(outdir)/$(a) $(bindir) &&) true
uninstallexe:
- $(foreach a, $(EXECUTABLES), rm -f $(bindir)/$(a)$(DOTEXE) &&) true
+ $(foreach a, $(EXECUTABLES), rm -f \
+ $(bindir)/$(program_prefix)$(a)$(program_suffix) && ) true
$(foreach a, $(SEXECUTABLES), rm -f $(bindir)/$(a) &&) true
# generic target names:
#
ifdef NAME
-EXECUTABLE = $(outdir)/$(NAME)$(EXE)
+EXECUTABLE = $(outdir)/$(NAME)
else
EXECUTABLE =
endif