From: fred Date: Wed, 27 Mar 2002 02:04:41 +0000 (+0000) Subject: lilypond-1.5.26 X-Git-Tag: release/1.5.59~376 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=89a340de265f70d56447718a8b809d809c23d8e2;p=lilypond.git lilypond-1.5.26 --- diff --git a/ChangeLog b/ChangeLog index e30cf2f8fd..262ee9a07b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,68 @@ +2001-12-14 Han-Wen + + * scripts/lilypond-book.py (LatexPaper.set_geo_option): + Convert strings with dimensions to numbers. + + * lily/volta-engraver.cc: only make a bracket for the top staff, + as found in stavesFound. + + * lily/bar-number-engraver.cc: remove staff administration. + + * lily/mark-engraver.cc (acknowledge_grob): remove staff + administration. This breaks support for invisible-staff. + + * lily/staff-collecting-engraver.cc: new engraver. Collects staff + symbols into stavesFound. + + * lily/score-engraver.cc (acknowledge_grob): Acknowledge spacing + grobs, and put them into columns. + + * lily/engraver-group-engraver.cc (acknowledge_grobs): Include the + Engraver_group_engraver as a potential candidate for ack'ing grobs. + +2001-12-13 Heikki Junes + + * lilypond-mode.el (LilyPond-command-next-midi): Play next (or last) + midi section in the Emacs-mode, so it is possible to play certain + score in a multiscore lilypond-file. + +2001-12-09 Rune Zedeler + * lily/lily-guile.cc: Added ly_assoc_front_x() and ly_assoc_cdr() + (FIXME: not accessible from guile) + + * lily/accidental-engraver.cc: rewrote accidental-routines to get + better support for Kurt Stone's suggestions. + Removed properties: noResetKey, forgetAccidentals, autoReminders, + lazyKeySignature. + Changed property: localKeySignature. + Added properties: extraNatural, autoAccidentals, + autoCautionaries. + (BUGFIX: broken-tie-support destroyed in 1.5.16) + + * ly/property-init.ly: added commands + \defaultAccidentals \modernAccidentals \modernCautionaries + \noResetKey \forgetAccidentals + + * ly/engraver-init.ly: Correct initialization of new accidentals. + + * scm/translator-property-description.scm: The new properties + added. + + * input/: Some examples added, some changed. + + * Documentation/regression-test.tely: Added quick test of new + accidentals. + +2001-12-13 Han-Wen Nienhuys + + * scripts/lilypond-book.py (scan_latex_preamble): don't crash if + header not found + +2001-12-07 Han-Wen Nienhuys + + * lily/beam.cc (before_line_breaking): Make beams without stems + or with only one stem disappear. + 2001-12-05 Han-Wen Nienhuys * bibtools/bib2html.py: Add simple bib2html convertor, and .bst diff --git a/lily/bar-engraver.cc b/lily/bar-engraver.cc index b18bdf251d..3e4c5f58d4 100644 --- a/lily/bar-engraver.cc +++ b/lily/bar-engraver.cc @@ -106,5 +106,5 @@ ENTER_DESCRIPTION(Bar_engraver, @code{whichBar} property. If it has no bar line to create, it will forbid a linebreak at this point", /* creats*/ "BarLine", /* acks */ "", -/* reads */ "whichBar stavesFound", +/* reads */ "whichBar", /* write */ ""); diff --git a/lily/bar-number-engraver.cc b/lily/bar-number-engraver.cc index d995158924..b6226d176d 100644 --- a/lily/bar-number-engraver.cc +++ b/lily/bar-number-engraver.cc @@ -11,7 +11,6 @@ #include "paper-column.hh" #include "paper-def.hh" #include "side-position-interface.hh" -#include "staff-symbol.hh" #include "item.hh" #include "moment.hh" #include "engraver.hh" @@ -26,7 +25,6 @@ protected: protected: virtual void stop_translation_timestep (); virtual void acknowledge_grob (Grob_info); - virtual void initialize (); virtual void create_grobs (); void create_items (); TRANSLATOR_DECLARATIONS( Bar_number_engraver ); @@ -63,31 +61,14 @@ Bar_number_engraver::Bar_number_engraver () text_p_ =0; } -void -Bar_number_engraver::initialize () -{ - /* - ugh: need to share code with mark_engraver - */ - daddy_trans_l_->set_property ("stavesFound", SCM_EOL); -} - - void Bar_number_engraver::acknowledge_grob (Grob_info inf) { Grob * s = inf.grob_l_; - if (Staff_symbol::has_interface (s)) - { - SCM sts = get_property ("stavesFound"); - SCM thisstaff = inf.grob_l_->self_scm (); - if (scm_memq (thisstaff, sts) == SCM_BOOL_F) - daddy_trans_l_->set_property ("stavesFound", gh_cons (thisstaff, sts)); - } - else if (text_p_ - && dynamic_cast (s) - && s->get_grob_property ("break-align-symbol") == ly_symbol2scm ("Left_edge_item")) + if (text_p_ + && dynamic_cast (s) + && s->get_grob_property ("break-align-symbol") == ly_symbol2scm ("Left_edge_item")) { /* By default this would land on the Paper_column -- so why @@ -125,6 +106,6 @@ ENTER_DESCRIPTION(Bar_number_engraver, /* descr */ "A bar number is created whenever measurePosition is zero. It is put on top of all staves, and appears only at left side of the staff.", /* creats*/ "BarNumber", -/* acks */ "staff-symbol-interface break-aligned-interface", -/* reads */ "currentBarNumber", +/* acks */ "break-aligned-interface", +/* reads */ "currentBarNumber stavesFound" , /* write */ ""); diff --git a/lily/engraver-group-engraver.cc b/lily/engraver-group-engraver.cc index c0cc4eb51d..e1c251152d 100644 --- a/lily/engraver-group-engraver.cc +++ b/lily/engraver-group-engraver.cc @@ -22,9 +22,8 @@ Engraver_group_engraver::announce_grob (Grob_info info) void -Engraver_group_engraver::create_grobs () +Engraver_group_engraver::create_grobs_in_simple_children () { - for (SCM p = simple_trans_list_; gh_pair_p (p); p = ly_cdr (p)) { Translator * t = unsmob_translator (ly_car (p)); @@ -34,6 +33,10 @@ Engraver_group_engraver::create_grobs () } } +/* + TODO: use this mechanism for the current Engraver_group_engraver as well. + + */ SCM find_acknowledge_engravers (SCM gravlist, SCM meta); void Engraver_group_engraver::acknowledge_grobs () @@ -71,7 +74,7 @@ Engraver_group_engraver::acknowledge_grobs () SCM acklist = scm_hashq_ref (tab, nm, SCM_UNDEFINED); if (acklist == SCM_BOOL_F) { - acklist= find_acknowledge_engravers (simple_trans_list_, meta); + acklist= find_acknowledge_engravers (gh_cons (self_scm (), simple_trans_list_), meta); scm_hashq_set_x (tab, nm, acklist); } @@ -94,13 +97,13 @@ Engraver_group_engraver::do_announces () dynamic_cast (t)->do_announces (); } - create_grobs (); + create_grobs_in_simple_children (); while (announce_info_arr_.size ()) { acknowledge_grobs (); announce_info_arr_.clear (); - create_grobs (); + create_grobs_in_simple_children (); } } @@ -129,8 +132,6 @@ Engraver_group_engraver::process_music () } } -void find_all_acknowledge_engravers (SCM tab, SCM gravlist, SCM allgrobs); - void Engraver_group_engraver::initialize () { @@ -145,7 +146,7 @@ Engraver_group_engraver::Engraver_group_engraver() {} ENTER_DESCRIPTION(Engraver_group_engraver, /* descr */ "A group of engravers taken together", /* creats*/ "", -/* acks */ "grob-interface", +/* acks */ "", /* reads */ "", /* write */ ""); diff --git a/lily/include/engraver-group-engraver.hh b/lily/include/engraver-group-engraver.hh index 5f0f5c6439..fb1f87141f 100644 --- a/lily/include/engraver-group-engraver.hh +++ b/lily/include/engraver-group-engraver.hh @@ -38,8 +38,8 @@ public: virtual void announce_grob (Grob_info); virtual void process_music (); private: - void create_grobs (); - void acknowledge_grobs (); + virtual void acknowledge_grobs (); + virtual void create_grobs_in_simple_children (); }; #endif // ENGRAVERGROUP_HH diff --git a/lily/include/score-engraver.hh b/lily/include/score-engraver.hh index 74631131bc..f984a5f6cc 100644 --- a/lily/include/score-engraver.hh +++ b/lily/include/score-engraver.hh @@ -45,16 +45,15 @@ protected: protected: /* Engraver_group_engraver interface */ + virtual void acknowledge_grob (Grob_info); virtual bool try_music (Music*); virtual void initialize (); virtual void finalize (); virtual void announce_grob (Grob_info); - virtual void do_announces (); virtual void typeset_grob (Grob*elem_p); virtual void stop_translation_timestep (); - }; #endif // SCORE_GRAV_HH diff --git a/lily/include/staff-symbol.hh b/lily/include/staff-symbol.hh index 2bc13a4e90..1968458fad 100644 --- a/lily/include/staff-symbol.hh +++ b/lily/include/staff-symbol.hh @@ -11,6 +11,7 @@ #define STAFF_SYMBOL_HH #include "lily-guile.hh" +#include "lily-proto.hh" /** TODO: add stafflinethickness as parameter. diff --git a/lily/line-of-score.cc b/lily/line-of-score.cc index 5ae17470b1..96f00ce5ba 100644 --- a/lily/line-of-score.cc +++ b/lily/line-of-score.cc @@ -147,7 +147,6 @@ set_loose_columns (Line_of_score* which, Column_x_positions const *posns) Item * right = 0; while (1) { - SCM between = loose->get_grob_property ("between-cols"); if (!gh_pair_p (between)) break; diff --git a/lily/mark-engraver.cc b/lily/mark-engraver.cc index 1a366e68b4..30384c3929 100644 --- a/lily/mark-engraver.cc +++ b/lily/mark-engraver.cc @@ -15,7 +15,6 @@ #include "lily-guile.hh" #include "paper-column.hh" #include "paper-def.hh" - #include "side-position-interface.hh" #include "staff-symbol-referencer.hh" #include "item.hh" @@ -38,7 +37,6 @@ protected: void create_items (Request*); virtual bool try_music (Music *req_l); virtual void start_translation_timestep (); - virtual void initialize (); virtual void process_music (); private: @@ -55,34 +53,11 @@ Mark_engraver::Mark_engraver () mark_req_l_ = 0; } -void -Mark_engraver::initialize () -{ - daddy_trans_l_->set_property ("stavesFound", SCM_EOL); // ugh: sharing with barnumber grav. -} - - - - -/* - -which grobs carry INVISIBLE-STAFF ? - -*/ - void Mark_engraver::acknowledge_grob (Grob_info inf) { Grob * s = inf.grob_l_; - if (Staff_symbol::has_interface (s) - || to_boolean (s->get_grob_property ("invisible-staff"))) - { - SCM sts = get_property ("stavesFound"); - SCM thisstaff = inf.grob_l_->self_scm (); - if (scm_memq (thisstaff, sts) == SCM_BOOL_F) - daddy_trans_l_->set_property ("stavesFound", gh_cons (thisstaff, sts)); - } - else if (text_p_ && Bar::has_interface (s)) + if (text_p_ && Bar::has_interface (s)) { /* Ugh. Figure out how to do this right at beginning of line, (without @@ -218,6 +193,6 @@ Mark_engraver::process_music () ENTER_DESCRIPTION(Mark_engraver, /* descr */ "", /* creats*/ "RehearsalMark", -/* acks */ "grob-interface", +/* acks */ "bar-line-interface", /* reads */ "rehearsalMark stavesFound", /* write */ ""); diff --git a/lily/rhythmic-column-engraver.cc b/lily/rhythmic-column-engraver.cc index 2957a3f0cf..c87409c450 100644 --- a/lily/rhythmic-column-engraver.cc +++ b/lily/rhythmic-column-engraver.cc @@ -122,6 +122,13 @@ Rhythmic_column_engraver::stop_translation_timestep () typeset_grob (note_column_); note_column_ =0; } + + if (spacing_) + { + typeset_grob (spacing_); + last_spacing_ = spacing_; + spacing_ =0; + } } void diff --git a/lily/score-engraver.cc b/lily/score-engraver.cc index 09bb7c4b33..6aad0e533e 100644 --- a/lily/score-engraver.cc +++ b/lily/score-engraver.cc @@ -18,6 +18,8 @@ #include "axis-group-interface.hh" #include "translator-def.hh" +#include "staff-spacing.hh" +#include "note-spacing.hh" /* TODO: the column creation logic is rather hairy. Revise it. @@ -38,7 +40,6 @@ Score_engraver::make_columns () ugh. */ if (!command_column_l_) - // || *unsmob_moment (command_column_l_->get_grob_property ("when")) != w) { set_columns (new Paper_column (get_property ("NonMusicalPaperColumn")), new Paper_column (get_property ("PaperColumn"))); @@ -134,20 +135,8 @@ Score_engraver::announce_grob (Grob_info info) { announce_info_arr_.push (info); pscore_p_->line_l_->typeset_grob (info.grob_l_); -} -/* All elements are propagated to the top upon announcement. If - something was created during one run of - Engraver_group_engraver::do_announces, then - announce_info_arr_.size () will be nonzero again -*/ -/* junkme? Done by Engraver_group_engraver::do_announces ()? - */ - -void -Score_engraver::do_announces () -{ - Engraver_group_engraver::do_announces (); + } @@ -294,7 +283,23 @@ Score_engraver::forbid_breaks () */ command_column_l_->remove_grob_property ("breakable"); } - + +void +Score_engraver::acknowledge_grob (Grob_info gi) +{ + if (Staff_spacing::has_interface (gi.grob_l_)) + { + Pointer_group_interface::add_element (command_column_l_, + ly_symbol2scm ("spacing-wishes"), + gi.grob_l_); + } + if (Note_spacing::has_interface (gi.grob_l_)) + { + Pointer_group_interface::add_element (musical_column_l_, + ly_symbol2scm ("spacing-wishes"), + gi.grob_l_); + } +} @@ -312,6 +317,6 @@ that there are no beams or notes that prevent a breakpoint.) ", /* creats*/ "LineOfScore PaperColumn NonMusicalPaperColumn", -/* acks */ "grob-interface", +/* acks */ "note-spacing-interface staff-spacing-interface", /* reads */ "currentMusicalColumn currentCommandColumn", /* write */ ""); diff --git a/lily/separating-line-group-engraver.cc b/lily/separating-line-group-engraver.cc index fc4a8c290f..fc8679494f 100644 --- a/lily/separating-line-group-engraver.cc +++ b/lily/separating-line-group-engraver.cc @@ -22,9 +22,9 @@ protected: Item * musical_malt_p_; Item * last_musical_malt_p_; - Grob * last_note_spacing_; - Grob * current_note_spacing_; - Grob * staff_spacing_; + Item * last_note_spacing_; + Item * current_note_spacing_; + Item * staff_spacing_; Spanner * sep_span_p_; diff --git a/lily/staff-collecting-engraver.cc b/lily/staff-collecting-engraver.cc new file mode 100644 index 0000000000..6efb537360 --- /dev/null +++ b/lily/staff-collecting-engraver.cc @@ -0,0 +1,45 @@ +/* +staff-collecting-engraver.cc -- implement Staff_collecting_engraver + +source file of the GNU LilyPond music typesetter + +(c) 2001 Han-Wen Nienhuys + + */ +#include "staff-symbol.hh" +#include "engraver.hh" +#include "grob.hh" +#include "translator-group.hh" + +class Staff_collecting_engraver : public Engraver +{ +public: + TRANSLATOR_DECLARATIONS(Staff_collecting_engraver); + virtual void acknowledge_grob (Grob_info); +}; + +Staff_collecting_engraver::Staff_collecting_engraver () +{ + +} + +void +Staff_collecting_engraver::acknowledge_grob (Grob_info gi) +{ + if (Staff_symbol::has_interface (gi.grob_l_)) + { + SCM staffs = get_property ("stavesFound"); + staffs = gh_cons (gi.grob_l_->self_scm (), staffs); + + daddy_trans_l_->set_property ("stavesFound", staffs); + } +} + + +ENTER_DESCRIPTION(Staff_collecting_engraver, +/* descr */ "Maintain the stavesFound variable", + +/* creats*/ "", +/* acks */ "staff-symbol-interface", +/* reads */ "stavesFound", +/* write */ "stavesFound"); diff --git a/lily/third-try.cc b/lily/third-try.cc index 15a2cbf748..b66e5f6129 100644 --- a/lily/third-try.cc +++ b/lily/third-try.cc @@ -1,5 +1,5 @@ /* - spacing-spanner.cc -- implement Spacing_spanner + spacing-spanner.cc -- implement Spacing_spanner source file of the GNU LilyPond music typesetter @@ -7,9 +7,102 @@ */ + +#include "paper-column.hh" + + class Third_spacing_spanner { public: void find_loose_columns () {} - + void prune_loose_colunms (Link_array *cols); + void find_loose_columns (Link_array cols); }; + + + +static bool +fixed_neighbor (Grob *col, SCM nm) +{ + SCM l = col->internal_get_grob_property (nm); + + if (!gh_pair_p (l)) + return false; + + Item * left = dynamic_cast (unsmob_grob (gh_car (l))); + return abs (Paper_column::rank_i (left->column_l ()) - Paper_column::rank_i (col)) == 1 ; +} + +void +Third_spacing_spanner::prune_loose_colunms (Link_array *cols) +{ + for (int i=cols->size (); i--; ) + { + + if (Item::breakable_b (cols->elem(i))) + continue; + + if (!fixed_neighbor (cols->elem(i), ly_symbol2scm ("left-neighbors")) + || !fixed_neighbor (cols->elem(i), ly_symbol2scm ("right-neighbors"))) + cols->del (i); + } +} + +void +Third_spacing_spanner::find_loose_columns (Link_array cols) +{ + for (int i=0; i< cols.size(); i++) + { + SCM right_neighbors = SCM_EOL; + int min_rank = 100000; // inf. + + for (SCM s = cols[i]-> get_grob_property ("spacing-wishes"); + gh_pair_p (s); s = gh_cdr (s)) + { + Grob * wish = unsmob_grob (gh_car (s)); + + Grob * left = unsmob_grob (wish->get_grob_property ("left-item")); + Grob * right = unsmob_grob (wish->get_grob_property ("right-item")); + + Item * li = dynamic_cast (left); + Item * ri = dynamic_cast (right); + + assert (li->column_l () == cols[i]); + + Item * rc = ri->column_l (); + Item * lc = li->column_l (); + int newrank = Paper_column::rank_i (lc); + + SCM neighbors = rc->get_grob_property ("left-neighbors"); + Item * left_neighbor = gh_pair_p (neighbors) + ? dynamic_cast (unsmob_grob (gh_car (neighbors))) : 0; + + left_neighbor = left_neighbor->column_l (); + if (left_neighbor) + { + int oldrank = Paper_column::rank_i (left_neighbor->column_l ()); + + if (newrank > oldrank) + { + neighbors= gh_cons (wish->self_scm (), SCM_EOL); + } + else if (newrank == oldrank) + { + neighbors = gh_cons (wish->self_scm (), neighbors); + } + } + + if (newrank < min_rank) + { + right_neighbors = gh_cons (wish->self_scm(), SCM_EOL); + min_rank = newrank; + } + else if (newrank == min_rank) + { + right_neighbors = gh_cons (wish->self_scm (), right_neighbors); + } + } + + cols[i]->set_grob_property ("right-neighbors", right_neighbors); + } +} diff --git a/lily/volta-engraver.cc b/lily/volta-engraver.cc index cc163f9bc9..e9026e63f5 100644 --- a/lily/volta-engraver.cc +++ b/lily/volta-engraver.cc @@ -14,6 +14,7 @@ #include "note-column.hh" #include "bar.hh" #include "side-position-interface.hh" +#include "staff-symbol.hh" /* Create Volta spanners, by reading repeatCommands property, usually @@ -34,12 +35,13 @@ protected: Moment started_mom_; Spanner *volta_span_p_; Spanner *end_volta_span_p_; - + SCM staff_; SCM start_str_; }; Volta_engraver::Volta_engraver () { + staff_ = SCM_EOL; volta_span_p_ = 0; end_volta_span_p_ = 0; } @@ -48,6 +50,27 @@ Volta_engraver::Volta_engraver () void Volta_engraver::process_music () { + if (unsmob_grob (staff_)) + { + /* + TODO: this does weird things when you open a piece with a + volta spanner. + + */ + SCM staffs = get_property ("stavesFound"); + + /* + only put a volta on the top staff. + + May be this is a bit convoluted, and we should have a single + volta engraver in score context or somesuch. + + */ + if (ly_car (scm_last_pair (staffs)) != staff_) + return ; + } + + SCM cs = get_property ("repeatCommands"); bool end = false; @@ -147,6 +170,17 @@ Volta_engraver::acknowledge_grob (Grob_info i) Volta_spanner::add_bar (end_volta_span_p_ , item); } } + else if (Staff_symbol::has_interface (i.grob_l_)) + { + /* + We only want to know about a single staff: then we add to the + support. */ + if (staff_ != SCM_EOL) + staff_ = SCM_UNDEFINED; + + if (staff_ != SCM_UNDEFINED) + staff_ = i.grob_l_->self_scm(); + } } void @@ -169,8 +203,6 @@ Volta_engraver::stop_translation_timestep () { if (end_volta_span_p_) { - Side_position_interface::add_staff_support (end_volta_span_p_); - typeset_grob (end_volta_span_p_); end_volta_span_p_ =0; } @@ -183,6 +215,6 @@ Volta_engraver::stop_translation_timestep () ENTER_DESCRIPTION(Volta_engraver, /* descr */ "Make volta brackets", /* creats*/ "VoltaBracket", -/* acks */ "bar-line-interface note-column-interface", -/* reads */ "repeatCommands voltaSpannerDuration", +/* acks */ "bar-line-interface staff-symbol-interface note-column-interface", +/* reads */ "repeatCommands voltaSpannerDuration stavesFound", /* write */ ""); diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 1df040265a..003d380d3f 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -324,6 +324,7 @@ ScoreContext = \translator { \name Score \consists "Repeat_acknowledge_engraver" + \consists "Staff_collecting_engraver" \consists "Timing_engraver" \consists "Output_property_engraver" \consists "System_start_delimiter_engraver" @@ -382,6 +383,10 @@ ScoreContext = \translator { tupletNumberFormatFunction = #denominator-tuplet-formatter subdivideBeams = ##f + extraNatural = ##t + autoAccidentals = #'((measure-same-octave . 0)) + autoCautionaries = #'() + keyAccidentalOrder = #'( (6 . -1) (2 . -1) (5 . -1 ) (1 . -1) (4 . -1) (0 . -1) (3 . -1) diff --git a/scripts/lilypond-book.py b/scripts/lilypond-book.py index efd48214a3..2e13e651fd 100644 --- a/scripts/lilypond-book.py +++ b/scripts/lilypond-book.py @@ -132,6 +132,16 @@ class LatexPaper: self.m_geo_x_marginparsep = None self.__body = None def set_geo_option(self, name, value): + + if type(value) == type(""): + m = re.match ("([0-9.]+)(cm|in|pt|mm|em|ex)",value) + if m: + unit = m.group (2) + num = string.atof(m.group (1)) + conv = dimension_conversion_dict[m.group(2)] + + value = conv(num) + if name == 'body' or name == 'text': if type(value) == type(""): self.m_geo_textwidth = value @@ -307,6 +317,7 @@ def pt2pt(x): dimension_conversion_dict ={ 'mm': mm2pt, + 'cm': lambda x: mm2pt(10*x), 'in': in2pt, 'em': em2pt, 'ex': ex2pt, @@ -614,7 +625,7 @@ def scan_latex_preamble(chunks): idx = idx + 1 continue m = get_re ('header').match(chunks[idx][1]) - if m.group (1): + if m <> None and m.group (1): options = re.split (',[\n \t]*', m.group(1)[1:-1]) else: options = [] @@ -628,8 +639,8 @@ def scan_latex_preamble(chunks): m = re.match("(\d\d)pt", o) if m: paperguru.m_fontsize = int(m.group(1)) - break + while chunks[idx][0] != 'preamble-end': if chunks[idx] == 'ignore': idx = idx + 1