From: Han-Wen Nienhuys Date: Fri, 14 Dec 2001 00:19:19 +0000 (+0100) Subject: release: 1.5.26 X-Git-Tag: release/1.5.26 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=f57dab636c0caf18cc0ec1c95a3b2bddb61496fd;p=lilypond.git release: 1.5.26 --- diff --git a/ChangeLog b/ChangeLog index df4321bea5..262ee9a07b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,31 @@ +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) @@ -25,6 +53,16 @@ * 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/VERSION b/VERSION index 4c89cef31a..d5f4d365ee 100644 --- a/VERSION +++ b/VERSION @@ -1,8 +1,8 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=5 -PATCH_LEVEL=25 -MY_PATCH_LEVEL=rz1 +PATCH_LEVEL=26 +MY_PATCH_LEVEL= # use the above to send patches: MY_PATCH_LEVEL is always empty for a # released version. diff --git a/input/test/accidentals.ly b/input/test/accidentals.ly deleted file mode 100644 index e69de29bb2..0000000000 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/beam.cc b/lily/beam.cc index 8bedaa22af..1c0ed8e545 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -78,14 +78,35 @@ Beam::before_line_breaking (SCM smob) { Grob * me = unsmob_grob (smob); - // Why? /* - Why what? Why the warning (beams with less than 2 stems are - degenerate beams, should never happen), or why would this ever - happen (don't know). */ + Beams with less than 2 two stems don't make much sense, but could happen + when you do + + [r8 c8 r8]. + + For a beam that only has one stem, we try to do some disappearance magic: + we revert the flag, and move on to The Eternal Engraving Fields.*/ + + if (visible_stem_count (me) < 2) { - warning (_ ("beam has less than two stems")); + warning (_ ("beam has less than two visible stems")); + + SCM stems = me->get_grob_property ("stems"); + if (scm_ilength (stems) == 1) + { + warning (_("Beam has less than two stems. Removing beam.")); + + unsmob_grob (gh_car (stems))->remove_grob_property ("beam"); + me->suicide (); + + return SCM_UNSPECIFIED; + } + else if (scm_ilength (stems) == 0) + { + me->suicide (); + return SCM_UNSPECIFIED; + } } if (visible_stem_count (me) >= 1) { 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/lily-guile.cc b/lily/lily-guile.cc index 2cf476fbbf..cf8dff1c2a 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -522,7 +522,23 @@ ly_assoc_chain (SCM key, SCM achain) /* looks the key up in the cdrs of the alist-keys - ignoring the car and ignoring non-pair keys. - Returns first match found. */ + Returns first match found, i.e. + + alist = ((1 . 10) + ((1 . 2) . 11) + ((2 . 1) . 12) + ((3 . 0) . 13) + ((4 . 1) . 14) ) + +I would like (ly_assoc_cdr 1) to return 12 - because it's the first +element with the cdr of the key = 1. In other words (alloc_cdr key) +corresponds to call + +(alloc (anything . key)) + + + +*/ SCM ly_assoc_cdr (SCM key, SCM alist) { 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/lilypond-mode.el b/lilypond-mode.el index 647f03862a..57c60489d6 100644 --- a/lilypond-mode.el +++ b/lilypond-mode.el @@ -143,12 +143,6 @@ in LilyPond-include-path." :group 'LilyPond :type 'string) -(defcustom LilyPond-midi-command "timidity" - "Command used to play MIDI files." - - :group 'LilyPond - :type 'string) - (defcustom LilyPond-gv-command "gv -watch" "Command used to display PS files." @@ -318,46 +312,47 @@ Must be the car of an entry in `LilyPond-command-alist'." ) (defun LilyPond-command-midi () - "View the ps output of current document." + "Play midi corresponding to the current document." (interactive) (LilyPond-command (LilyPond-command-menu "Midi") 'LilyPond-master-file) ) -(defun LilyPond-command-formatdvi () - "Format the dvi output of the current document." - (interactive) - (LilyPond-command (LilyPond-command-menu "2Dvi") 'LilyPond-master-file) -) - -(defun LilyPond-command-formatps () - "Format the ps output of the current document." - (interactive) - (LilyPond-command (LilyPond-command-menu "2PS") 'LilyPond-master-file) -) - -(defun LilyPond-command-smartview () - "View the dvi output of current document." - (interactive) - (LilyPond-command (LilyPond-command-menu "SmartView") 'LilyPond-master-file) -) - -(defun LilyPond-command-view () - "View the dvi output of current document." +(defun count-rexp (start end rexp) + "Print number of found regular expressions in the region." + (interactive "r") + (save-excursion + (save-restriction + (narrow-to-region start end) + (goto-char (point-min)) + (count-matches rexp)))) + +(defun count-midi-words () + "Print number of scores before the curser." (interactive) - (LilyPond-command (LilyPond-command-menu "View") 'LilyPond-master-file) -) - -(defun LilyPond-command-viewps () - "View the ps output of current document." + (count-rexp (point-min) (point-max) "\\\\midi")) + +(defun count-midi-words-backwards () + "Print number of scores before the curser." (interactive) - (LilyPond-command (LilyPond-command-menu "ViewPS") 'LilyPond-master-file) -) - -(defun LilyPond-command-midi () - "View the ps output of current document." + (count-rexp (point-min) (point) "\\\\midi")) + +(defun LilyPond-command-next-midi () + "Play next midi score of the current document." (interactive) - (LilyPond-command (LilyPond-command-menu "Midi") 'LilyPond-master-file) -) + (LilyPond-compile-file + (let ((allscores (count-midi-words)) + (scores (count-midi-words-backwards)) + (fname (LilyPond-master-file))) + (let ((count (string-to-number (substring scores 0 (+ (length scores) -12))))) + (concat LilyPond-midi-command " " + (substring fname 0 (+ (length fname) -3)) ; suppose ".ly" + (if (not (string= "1 occurrences" allscores)) ; only one score + (if (not (eq count 0)) ; first score + (if (string= scores allscores) ; last score + (concat "-" (number-to-string (+ count -1))) + (concat "-" (number-to-string count))))) + ".midi"))) + "Midi")) ;; FIXME, this is broken (defun LilyPond-region-file (begin end) @@ -473,15 +468,15 @@ command." (define-key LilyPond-mode-map "\C-c\C-s" 'LilyPond-command-smartview) (define-key LilyPond-mode-map "\C-c\C-v" 'LilyPond-command-view) (define-key LilyPond-mode-map "\C-c\C-p" 'LilyPond-command-viewps) - (define-key LilyPond-mode-map "\C-c\C-m" 'LilyPond-command-midi) - (define-key LilyPond-mode-map "\C-cn" 'lilypond-notes) - (define-key LilyPond-mode-map "\C-cs" 'lilypond-score) + (define-key LilyPond-mode-map "\C-c\C-m" 'LilyPond-command-next-midi) + (define-key LilyPond-mode-map "\C-cn" 'LilyPond-insert-tag-notes) + (define-key LilyPond-mode-map "\C-cs" 'LilyPond-insert-tag-score) ) ;;; Menu Support -(define-skeleton lilypond-notes - "Lilypond notes tag." +(define-skeleton LilyPond-insert-tag-notes + "LilyPond notes tag." nil ; (if (bolp) nil ?\n) "\\notes" @@ -489,8 +484,8 @@ command." (concat " \\relative " (skeleton-read "Relative: " "" str))) " { " _ " }") -(define-skeleton lilypond-score - "Lilypond score tag." +(define-skeleton LilyPond-insert-tag-score + "LilyPond score tag." nil (if (bolp) nil ?\n) "\\score {\n" @@ -537,9 +532,9 @@ command." :keys "C-c C-r" :style radio :selected (eq LilyPond-command-current 'LilyPond-command-region) ])) '(("Insert" - [ "\\notes..." lilypond-notes + [ "\\notes..." LilyPond-insert-tag-notes :keys "C-c n" ] - [ "\\score..." lilypond-score + [ "\\score..." LilyPond-insert-tag-score :keys "C-c s" ] )) ; (let ((file 'LilyPond-command-on-current)) @@ -554,7 +549,7 @@ command." '([ "SmartView" (LilyPond-command (LilyPond-command-menu "SmartView") 'LilyPond-master-file) :keys "C-c C-s"]) '([ "View" (LilyPond-command (LilyPond-command-menu "View") 'LilyPond-master-file) :keys "C-c C-v"]) '([ "ViewPS" (LilyPond-command (LilyPond-command-menu "ViewPS") 'LilyPond-master-file) :keys "C-c C-p"]) - '([ "Midi" (LilyPond-command (LilyPond-command-menu "Midi") 'LilyPond-master-file) :keys "C-c C-m"]) + '([ "Midi" (LilyPond-command-next-midi) :keys "C-c C-m"]) )) (defconst LilyPond-imenu-generic-re "^\\([a-zA-Z_][a-zA-Z0-9_]*\\) *=" diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 691dcb2aaf..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" diff --git a/ly/property-init.ly b/ly/property-init.ly index 4b200d509b..3b40500bb5 100644 --- a/ly/property-init.ly +++ b/ly/property-init.ly @@ -97,7 +97,6 @@ voiceTwo = { \slurDown \tieDown \dotsDown - } voiceThree = { diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm index 28cc1a6459..e9bc7e9f71 100644 --- a/make/out/lilypond.lsm +++ b/make/out/lilypond.lsm @@ -1,15 +1,15 @@ Begin3 Title: LilyPond -Version: 1.5.25 -Entered-date: 05DEC01 +Version: 1.5.26 +Entered-date: 14DEC01 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.5.25.tar.gz + 1000k lilypond-1.5.26.tar.gz Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/ - 1000k lilypond-1.5.25.tar.gz + 1000k lilypond-1.5.26.tar.gz Copying-policy: GPL End diff --git a/make/out/lilypond.mandrake.spec b/make/out/lilypond.mandrake.spec index 7027054c8c..0bfd672632 100644 --- a/make/out/lilypond.mandrake.spec +++ b/make/out/lilypond.mandrake.spec @@ -1,5 +1,5 @@ %define name lilypond -%define version 1.5.25 +%define version 1.5.26 %define release 1mdk Name: %{name} diff --git a/make/out/lilypond.redhat.spec b/make/out/lilypond.redhat.spec index c31da8a65b..3f62515f68 100644 --- a/make/out/lilypond.redhat.spec +++ b/make/out/lilypond.redhat.spec @@ -1,11 +1,11 @@ %define info yes Name: lilypond -Version: 1.5.25 +Version: 1.5.26 Release: 1 License: GPL Group: Applications/Publishing -Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.25.tar.gz +Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.26.tar.gz Summary: Create and print music notation URL: http://www.lilypond.org/ BuildRoot: /tmp/lilypond-install diff --git a/make/out/lilypond.suse.spec b/make/out/lilypond.suse.spec index 3a460b67b3..35b61fe56b 100644 --- a/make/out/lilypond.suse.spec +++ b/make/out/lilypond.suse.spec @@ -14,11 +14,11 @@ Distribution: SuSE Linux 7.0 (i386) Name: lilypond -Version: 1.5.25 +Version: 1.5.26 Release: 2 Copyright: GPL Group: Applications/Publishing -Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.25.tar.gz +Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.26.tar.gz # music notation software for.. ? Summary: A program for printing sheet music. URL: http://www.lilypond.org/ 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 diff --git a/scripts/ly2dvi.py b/scripts/ly2dvi.py index 2a93542dd0..62d6bbf561 100644 --- a/scripts/ly2dvi.py +++ b/scripts/ly2dvi.py @@ -443,7 +443,7 @@ def analyse_lilypond_output (filename, extra): # search only the first 10k s = s[:10240] - for x in ('textheight', 'linewidth', 'papersize', 'orientation'): + for x in extra_fields: m = re.search (r'\\def\\lilypondpaper%s{([^}]*)}'%x, s) if m: set_setting (extra, x, m.group (1))