From e9bc63b5b5a7d3ce5da1022506af16c27c9c8bfa Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Wed, 9 Apr 2003 11:23:57 +0000 Subject: [PATCH] * lily/multi-measure-rest-engraver.cc (class Multi_measure_rest_engraver): make multiple Number objects, one for each MultiMeasureTextEvent. * scm/music-functions.scm (glue-mm-rest-texts): use MultiMeasureTextEvent * scm/music-types.scm (music-descriptions): add MultiMeasureTextEvent * Documentation/user/refman.itely (Multi measure rests): update. --- ChangeLog | 13 ++ Documentation/user/refman.itely | 20 ++- input/regression/multi-measure-rest-text.ly | 5 +- lily/multi-measure-rest-engraver.cc | 133 +++++++++++++++----- scm/grob-description.scm | 16 ++- scm/music-functions.scm | 26 ++-- scm/music-types.scm | 11 +- 7 files changed, 155 insertions(+), 69 deletions(-) diff --git a/ChangeLog b/ChangeLog index d5066b97e4..3b72bb36a7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2003-04-09 Han-Wen Nienhuys + + * lily/multi-measure-rest-engraver.cc (class + Multi_measure_rest_engraver): make multiple Number objects, one + for each MultiMeasureTextEvent. + + * scm/music-functions.scm (glue-mm-rest-texts): use + MultiMeasureTextEvent + + * scm/music-types.scm (music-descriptions): add MultiMeasureTextEvent + + * Documentation/user/refman.itely (Multi measure rests): update. + 2003-04-08 Han-Wen Nienhuys * lily/ly-module.cc (ly_copy_module_variables): use diff --git a/Documentation/user/refman.itely b/Documentation/user/refman.itely index e7a814dd0f..7cb69f1e0f 100644 --- a/Documentation/user/refman.itely +++ b/Documentation/user/refman.itely @@ -3855,7 +3855,7 @@ effect music that appears inside a @code{\transpose}. Multi measure rests are entered using `@code{R}'. It is specifically meant for full bar rests and for entering parts: the rest can expand to fill a score with rests, or it can be printed as a single multimeasure -rest This expansion is controlled by the property +rest. This expansion is controlled by the property @code{Score.skipBars}. If this is set to true, Lily will not expand empty measures, and the appropriate number is added automatically. @@ -3894,26 +3894,20 @@ is provided for a fermata. @lilypond[verbatim,fragment] \time 3/4 - R2._\markup { \roman "Ad lib" } + R2._\markup { "Ad lib" } R2.^\fermataMarkup @end lilypond -By default, the multi-measure rest uses the number font, which does -not contain any letters. This is the reason for the explicit -@code{\roman} in the above example. - @cindex whole rests for a full measure -The object for this object is @internalsref{MultiMeasureRest}, and -@internalsref{MultiMeasureRestNumber}. +The object for this object is @internalsref{MultiMeasureRest}, +@internalsref{MultiMeasureRestNumber} (for the default number), and +@internalsref{MultiMeasureRestText} (for user specified texts). @refbugs -Only one text can be put on a multi-measure rest with -@var{note}-@var{text} syntax, since this is internally converted to -setting @code{#'text} in @internalsref{MultiMeasureRestNumber}. It is -not possible to use fingerings (e.g. @code{R1-4}) to put numbers over -multi-measure rests. +It is not possible to use fingerings (e.g. @code{R1-4}) to put numbers +over multi-measure rests. @cindex condensing rests diff --git a/input/regression/multi-measure-rest-text.ly b/input/regression/multi-measure-rest-text.ly index 4ee40d75bd..3f7bbdd01d 100644 --- a/input/regression/multi-measure-rest-text.ly +++ b/input/regression/multi-measure-rest-text.ly @@ -1,9 +1,7 @@ \header { texidoc = " -Texts may be added to the rests by setting @code{text} in -@code{MultiMeasureRestNumber.}. This is done automatically -for the first script specified by @code{R_\markup @{ .. @}}. +Texts may be added to the multi measure rests. " } @@ -13,5 +11,6 @@ for the first script specified by @code{R_\markup @{ .. @}}. R2._\markup { \center << \musicglyph #"scripts-dfermata" \roman "Ad lib" >> } R2.^\fermataMarkup R2.^"4" + R2.*10^"inner"^"top"_"inner"_"bot" c2. }} diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc index 252036beab..72aedc7d28 100644 --- a/lily/multi-measure-rest-engraver.cc +++ b/lily/multi-measure-rest-engraver.cc @@ -35,14 +35,15 @@ private: Music * new_req_; Music * busy_span_req_; Music * stop_req_; + Link_array text_events_; int start_measure_; Moment start_moment_; Spanner *mmrest_; - Spanner *number_; + Link_array numbers_; - Spanner *last_number_; + Link_array last_numbers_; Spanner *last_rest_; }; @@ -51,7 +52,6 @@ Multi_measure_rest_engraver::Multi_measure_rest_engraver () start_measure_ = 0; mmrest_ = 0; last_rest_ =0; - number_ = 0; new_req_ = busy_span_req_ = stop_req_ =0; } @@ -71,6 +71,11 @@ Multi_measure_rest_engraver::try_music (Music* req) } return true; } + else if (req->is_mus_type ("multi-measure-text-event")) + { + text_events_.push (req); + return true; + } return false; } @@ -98,13 +103,57 @@ Multi_measure_rest_engraver::process_music () if (busy_span_req_ && !mmrest_) { mmrest_ = new Spanner (get_property ("MultiMeasureRest")); - number_ = new Spanner (get_property ("MultiMeasureRestNumber")); - Side_position_interface::add_support (number_, mmrest_); - number_->set_parent (mmrest_, Y_AXIS); + if (text_events_.size()) + { + for (int i = 0; i < text_events_.size(); i++) + { + Spanner *sp + = new Spanner (get_property ("MultiMeasureRestText")); + Music* e = text_events_[i]; + SCM t = e->get_mus_property ("text"); + SCM dir = e->get_mus_property ("direction"); + sp->set_grob_property ("text",t); + if (ly_dir_p (dir)) + sp->set_grob_property ("direction",dir); + + numbers_.push (sp); + announce_grob (sp, e->self_scm()); + } + + /* + Stack different scripts. + */ + Direction d = DOWN; + do { + Grob *last =0; + for (int i=0; i get_grob_property ("direction")) + { + if (last) + Side_position_interface::add_support (numbers_[i], last); + last = numbers_[i]; + } + } + } while (flip (&d) != DOWN); + } + else + { + Spanner *sp + = new Spanner (get_property ("MultiMeasureRestNumber")); + numbers_.push (sp); + announce_grob (sp, busy_span_req_->self_scm()); + } + + for (int i =0 ; i < numbers_.size(); i++) + { + Side_position_interface::add_support (numbers_[i], mmrest_); + numbers_[i]->set_parent (mmrest_, Y_AXIS); + } + announce_grob (mmrest_, busy_span_req_->self_scm()); - announce_grob (number_, busy_span_req_->self_scm()); start_measure_ = gh_scm2int (get_property ("currentBarNumber")); } @@ -116,12 +165,14 @@ Multi_measure_rest_engraver::process_music () if (mmrest_) { add_bound_item (mmrest_, it); - add_bound_item (number_, it); + for (int i = 0; i < numbers_.size(); i++) + add_bound_item (numbers_[i], it); } if (last_rest_) { add_bound_item (last_rest_,it); - add_bound_item (last_number_, it); + for (int i = 0; i < last_numbers_.size(); i++) + add_bound_item (last_numbers_[i], it); } } } @@ -137,14 +188,16 @@ Multi_measure_rest_engraver::stop_translation_timestep () && mmrest_->get_bound (LEFT) && mmrest_->get_bound (RIGHT)) { typeset_grob (mmrest_); - typeset_grob (number_); - Side_position_interface::add_staff_support (number_); + for (int i = 0 ; i < numbers_.size(); i++) + { + typeset_grob (numbers_[i]); + Side_position_interface::add_staff_support (numbers_[i]); + } + /* we must keep mmrest_ around to set measure-count, so no mmrest_ = 0 here. */ - - } if (last_rest_) @@ -154,10 +207,15 @@ Multi_measure_rest_engraver::stop_translation_timestep () && last_rest_->get_bound (LEFT) != last_rest_->get_bound (RIGHT)) { typeset_grob (last_rest_); - typeset_grob (last_number_); + + /* + huh ? add-staff-support ? + */ + for (int i = 0; i < last_numbers_.size ();i++) + typeset_grob (last_numbers_[i]); } last_rest_ = 0; - last_number_ = 0; + last_numbers_.clear(); } if (new_req_) @@ -165,7 +223,8 @@ Multi_measure_rest_engraver::stop_translation_timestep () busy_span_req_ = new_req_; new_req_ =0; } - + + text_events_.clear (); } void @@ -177,7 +236,7 @@ Multi_measure_rest_engraver::start_translation_timestep () if (mmrest_ && !mp.to_bool ()) { last_rest_ = mmrest_; - last_number_ = number_; + last_numbers_ = numbers_; int cur = gh_scm2int (get_property ("currentBarNumber")); int num = cur - start_measure_; @@ -192,36 +251,44 @@ Multi_measure_rest_engraver::start_translation_timestep () mmrest_ = 0; - SCM text =last_number_->get_grob_property ("text"); - SCM thres = get_property ("restNumberThreshold"); - int t = 1; - if (gh_number_p (thres)) - t = gh_scm2int (thres); - - if (text == SCM_EOL && num <= t) - last_number_->suicide(); - else if (text == SCM_EOL) + Grob * last = last_numbers_.size() ? last_numbers_[0] : 0; + if (last && last->get_grob_property ("text") == SCM_EOL) { - text = scm_number_to_string (gh_int2scm (num), SCM_MAKINUM (10)); - last_number_->set_grob_property ("text", text); + SCM thres = get_property ("restNumberThreshold"); + int t = 1; + if (gh_number_p (thres)) + t = gh_scm2int (thres); + + if (num <= t) + last->suicide(); + else + { + SCM text + = scm_number_to_string (gh_int2scm (num), SCM_MAKINUM (10)); + last->set_grob_property ("text", text); + } } } } - void Multi_measure_rest_engraver::finalize () { if (mmrest_) { typeset_grob (mmrest_); - typeset_grob (number_); } if (last_rest_) { typeset_grob (last_rest_); - typeset_grob (last_number_); } + + for (int i = 0; i < last_numbers_.size ();i++) + typeset_grob (last_numbers_[i]); + + for (int i = 0; i < numbers_.size ();i++) + typeset_grob (numbers_[i]); + } ENTER_DESCRIPTION(Multi_measure_rest_engraver, @@ -231,8 +298,8 @@ ENTER_DESCRIPTION(Multi_measure_rest_engraver, "over the MultiMeasureRest. Reads measureLength to determine if it " "should use a whole rest or a breve rest to represent 1 measure " , -/* creats*/ "MultiMeasureRest MultiMeasureRestNumber", -/* accepts */ "multi-measure-rest-event", +/* creats*/ "MultiMeasureRest MultiMeasureRestNumber MultiMeasureRestText", +/* accepts */ "multi-measure-rest-event multi-measure-text-event", /* acks */ "", /* reads */ "currentBarNumber restNumberThreshold currentCommandColumn measurePosition measureLength", /* write */ ""); diff --git a/scm/grob-description.scm b/scm/grob-description.scm index 2d153f6da2..926f93277e 100644 --- a/scm/grob-description.scm +++ b/scm/grob-description.scm @@ -582,9 +582,19 @@ (font-family . number) (meta . ((interfaces . (side-position-interface self-alignment-interface font-interface spanner-interface text-interface)))) )) - - - (NoteCollision + (MultiMeasureRestText + . ( + (molecule-callback . ,brew-new-markup-molecule) + (X-offset-callbacks . (,Self_alignment_interface::aligned_on_self + ,Self_alignment_interface::centered_on_other_axis_parent)) + (Y-offset-callbacks . (,Side_position_interface::aligned_side)) + (self-alignment-X . 0) + (direction . 1) + (padding . 2) + (font-family . roman) + (meta . ((interfaces . (side-position-interface self-alignment-interface font-interface spanner-interface text-interface)))) + )) + (NoteCollision . ( (axes . (0 1)) ;; Ugh, should not be hard-coded. diff --git a/scm/music-functions.scm b/scm/music-functions.scm index bc18a53b3d..da4bf788af 100644 --- a/scm/music-functions.scm +++ b/scm/music-functions.scm @@ -256,19 +256,13 @@ a property set for MultiMeasureRestNumber." ( (text (ly:get-mus-property script-music 'text)) (dir (ly:get-mus-property script-music 'direction)) - (p (make-grob-property-set 'MultiMeasureRestNumber 'text text)) - (d (if (ly:dir? dir) - (make-grob-property-set 'MultiMeasureRestNumber 'direction dir) - #f)) - (l (list p)) + (p (make-music-by-name 'MultiMeasureTextEvent)) ) - (ly:set-mus-property! p 'once #t) - (if d - (begin - (ly:set-mus-property! d 'once #t) - (set! l (cons d l)))) - - (context-spec-music (make-sequential-music l) "Voice") + + (if (ly:dir? dir) + (ly:set-mus-property! p 'direction dir)) + (ly:set-mus-property! p 'text text) + p )) (if (eq? (ly:get-mus-property music 'name) 'MultiMeasureRestMusicGroup) @@ -276,15 +270,15 @@ a property set for MultiMeasureRestNumber." ( (text? (lambda (x) (memq 'script-event (ly:get-mus-property x 'types)))) (es (ly:get-mus-property music 'elements)) - (texts (filter-list text? es)) + (texts (map script-to-mmrest-text (filter-list text? es))) (others (filter-out-list text? es)) ) (if (pair? texts) (ly:set-mus-property! music 'elements - (cons (script-to-mmrest-text (car texts)) - others)) - ) + (cons (make-event-chord texts) others) + )) + (display-music music) )) music ) diff --git a/scm/music-types.scm b/scm/music-types.scm index 6a97006b29..8247d6ff6e 100644 --- a/scm/music-types.scm +++ b/scm/music-types.scm @@ -229,8 +229,17 @@ e.g. @code{\\mark \"A\"}.") (description . "Rests that may be compressed into Multi rests. Syntax @code{R2.*4} for 4 measures in 3/4 time. Note the capital R.") (internal-class-name . "Event") - (types . (general-music event multi-measure-rest-event)) + (types . (general-music event span-event multi-measure-rest-event)) )) + + (MultiMeasureTextEvent + . ( + (description . "Texts on mm rests. Syntax +@code{R-\\markup { \\roman \"bla\"}. Note the explicit font switch.") + (internal-class-name . "Event") + (types . (general-music event multi-measure-text-event)) + )) + (Music . ( (description . "Generic type for music expressions.") -- 2.39.5