From 0a84151a3709fcf51b4b77f0e7e991db1a47eafc Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Wed, 21 May 2003 23:55:59 +0000 Subject: [PATCH] (try_music): new file, handle slash repeats separately. Slash repeats and % repeats can now be nested. --- ChangeLog | 6 + Documentation/user/refman.itely | 6 +- input/regression/percent-repeat.ly | 20 --- ...skipbars.ly => repeat-percent-skipbars.ly} | 0 input/regression/repeat-percent.ly | 13 ++ input/regression/repeat-slash.ly | 15 ++ lily/percent-repeat-engraver.cc | 32 +--- lily/slash-repeat-engraver.cc | 149 ++++++++++++++++++ ly/engraver-init.ly | 1 + 9 files changed, 194 insertions(+), 48 deletions(-) delete mode 100644 input/regression/percent-repeat.ly rename input/regression/{percent-repeat-skipbars.ly => repeat-percent-skipbars.ly} (100%) create mode 100644 input/regression/repeat-percent.ly create mode 100644 input/regression/repeat-slash.ly create mode 100644 lily/slash-repeat-engraver.cc diff --git a/ChangeLog b/ChangeLog index ccd6c65cd3..40b302145b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2003-05-22 Han-Wen Nienhuys + + * lily/slash-repeat-engraver.cc (try_music): new file, handle + slash repeats separately. Slash repeats and % + repeats can now be nested. + 2003-05-22 Heikki Junes * lilypond-indent.el: Add preliminary test for closing \] and \). diff --git a/Documentation/user/refman.itely b/Documentation/user/refman.itely index c4092ebcc7..f57d77e8b2 100644 --- a/Documentation/user/refman.itely +++ b/Documentation/user/refman.itely @@ -2273,7 +2273,8 @@ example file @inputfileref{input/test,unfold-all-repeats.ly}. Timing information is not remembered at the start of an alternative, so you have to reset timing information after a repeat, e.g. using a bar-check (See @ref{Bar check}), setting @code{Score.measurePosition} -or entering @code{\partial}. Slurs or ties are also not repeated. +or entering @code{\partial}. Similarly, slurs or ties are also not +repeated. @node Manual repeat commands @@ -2391,8 +2392,7 @@ patterns that divide the measure length are replaced by slashes. @refbugs -You cannot nest percent repeats, e.g. by filling in the first measure -with slashes, and repeating that measure with percents. +Single measure and double measure percent-repeats cannot be nested. @node Rhythmic music @section Rhythmic music diff --git a/input/regression/percent-repeat.ly b/input/regression/percent-repeat.ly deleted file mode 100644 index 04ac83e199..0000000000 --- a/input/regression/percent-repeat.ly +++ /dev/null @@ -1,20 +0,0 @@ -\version "1.7.18" -\header { -texidoc = "Measure and beat repeats are supported." -} - -\score { \notes \relative c' \context Voice { \time 4/4 - \repeat "percent" 2 { c2 } - - % the chairman dances - \repeat "percent" 2 { g'8 g c, c } - \repeat "percent" 4 { b8 b8 } - \repeat "percent" 2 { c8 d es f g4 r4 } - - % riff - \repeat "percent" 2 { r8. a16 g8. a16 bes8. a16 f8 d | a c8 ~ c8 d8 ~ d8 r8 r4 } - - - - }} -%% new-chords-done %% diff --git a/input/regression/percent-repeat-skipbars.ly b/input/regression/repeat-percent-skipbars.ly similarity index 100% rename from input/regression/percent-repeat-skipbars.ly rename to input/regression/repeat-percent-skipbars.ly diff --git a/input/regression/repeat-percent.ly b/input/regression/repeat-percent.ly new file mode 100644 index 0000000000..b28f6cb6e4 --- /dev/null +++ b/input/regression/repeat-percent.ly @@ -0,0 +1,13 @@ +\version "1.7.18" +\header { +texidoc = "Measure repeats are supported, and may be nested with beat repeats." +} + +\score { \notes \relative c'' \context Voice { \time 4/4 + % riff + \repeat "percent" 2 { r8. a16 g8. a16 bes8. a16 f8 d | a c8 ~ c8 d8 ~ d8 r8 r4 } + + \repeat "percent" 2 { \repeat "percent" 4 { c8 es } } + } +} +%% new-chords-done %% diff --git a/input/regression/repeat-slash.ly b/input/regression/repeat-slash.ly new file mode 100644 index 0000000000..f572ed0a46 --- /dev/null +++ b/input/regression/repeat-slash.ly @@ -0,0 +1,15 @@ +\version "1.7.18" +\header { +texidoc = "Beat repeats are supported." +} + +\score { \notes \relative c' + \context Voice { \time 4/4 + \repeat "percent" 2 { c2 } + + % the chairman dances + \repeat "percent" 2 { g'8 g c, c } + \repeat "percent" 4 { b8 b8 } + } + \paper { raggedright = ##t } +} diff --git a/lily/percent-repeat-engraver.cc b/lily/percent-repeat-engraver.cc index 63ff323b14..517ba46561 100644 --- a/lily/percent-repeat-engraver.cc +++ b/lily/percent-repeat-engraver.cc @@ -51,16 +51,13 @@ protected: enum { UNKNOWN, - BEAT, MEASURE, DOUBLE_MEASURE, } repeat_sign_type_ ; - Item * beat_slash_; Item * double_percent_; Spanner * perc_; Spanner * finished_perc_; - Item * stem_tremolo_; protected: virtual void finalize (); virtual bool try_music (Music*); @@ -71,11 +68,10 @@ protected: Percent_repeat_engraver::Percent_repeat_engraver () { - perc_ = finished_perc_ = 0; + perc_ = 0; + finished_perc_ = 0; repeat_ =0; - stem_tremolo_ = 0; - beat_slash_ = 0; double_percent_ = 0; } @@ -101,10 +97,7 @@ Percent_repeat_engraver::try_music (Music * m) if (unsmob_moment (m)) meas_len = *unsmob_moment (m); - if (body_length_ < meas_len && - meas_len.main_part_.mod_rat (body_length_.main_part_) == Moment (Rational (0,0))) - repeat_sign_type_ = BEAT; - else if (meas_len == body_length_) + if (meas_len == body_length_) repeat_sign_type_ = MEASURE; else if (Moment (2)* meas_len == body_length_) { @@ -135,12 +128,7 @@ Percent_repeat_engraver::process_music () { if (repeat_ && now_mom () == next_moment_) { - if (repeat_sign_type_ == BEAT) - { - beat_slash_ = new Item (get_property ("RepeatSlash")); - announce_grob(beat_slash_, repeat_->self_scm()); - } - else if (repeat_sign_type_ == MEASURE) + if (repeat_sign_type_ == MEASURE) { finished_perc_ = perc_; typeset_perc (); @@ -172,7 +160,7 @@ Percent_repeat_engraver::finalize () typeset_perc (); if (perc_) { - repeat_->origin ()->warning (_ ("unterminated chord tremolo")); + repeat_->origin ()->warning (_ ("unterminated percent repeat")); perc_->suicide (); } } @@ -188,12 +176,6 @@ Percent_repeat_engraver::typeset_perc () finished_perc_ = 0; } - if (beat_slash_) - { - typeset_grob (beat_slash_); - beat_slash_ = 0; - } - if (double_percent_) { typeset_grob (double_percent_); @@ -231,8 +213,8 @@ Percent_repeat_engraver::stop_translation_timestep () ENTER_DESCRIPTION(Percent_repeat_engraver, -/* descr */ "Make beat, whole bar and double bar repeats.", -/* creats*/ "PercentRepeat RepeatSlash DoublePercentRepeat", +/* descr */ "Make whole bar and double bar repeats.", +/* creats*/ "PercentRepeat DoublePercentRepeat", /* accepts */ "repeated-music", /* acks */ "", /* reads */ "measureLength currentCommandColumn", diff --git a/lily/slash-repeat-engraver.cc b/lily/slash-repeat-engraver.cc new file mode 100644 index 0000000000..456013b67f --- /dev/null +++ b/lily/slash-repeat-engraver.cc @@ -0,0 +1,149 @@ +/* + slash-repeat-engraver.cc -- implement Chord_tremolo_engraver + + source file of the GNU LilyPond music typesetter + + (c) 2000--2003 Han-Wen Nienhuys + + */ + +#include "engraver.hh" +#include "repeated-music.hh" +#include "engraver-group-engraver.hh" +#include "global-translator.hh" +#include "warn.hh" +#include "misc.hh" +#include "spanner.hh" +#include "item.hh" +#include "percent-repeat-iterator.hh" +#include "bar-line.hh" + +#include "score-engraver.hh" +#include "translator-group.hh" + +/** + This acknowledges repeated music with "percent" style. It typesets + a % sign. + + TODO: + + - BEAT case: Create items for single beat repeats, i.e. c4 / / / + + - DOUBLE_MEASURE case: attach a % to an appropriate barline. + +*/ +class Slash_repeat_engraver : public Engraver +{ +public: + TRANSLATOR_DECLARATIONS(Slash_repeat_engraver); +protected: + Repeated_music * repeat_; + + /// moment (global time) where beam started. + Moment start_mom_; + Moment stop_mom_; + + /// location within measure where beam started. + Moment beam_start_location_; + Moment next_moment_; + Moment body_length_; + + Item * beat_slash_; + Item * double_percent_; +protected: + virtual bool try_music (Music*); + virtual void stop_translation_timestep (); + virtual void start_translation_timestep (); + virtual void process_music (); +}; + +Slash_repeat_engraver::Slash_repeat_engraver () +{ + repeat_ =0; + beat_slash_ = 0; +} + +bool +Slash_repeat_engraver::try_music (Music * m) +{ + Repeated_music * rp = dynamic_cast (m); + if (rp + && !repeat_ + && rp->get_mus_property ("iterator-ctor") + == Percent_repeat_iterator::constructor_proc) + { + body_length_ = rp->body_get_length (); + int count = rp->repeat_count (); + + Moment now = now_mom (); + start_mom_ = now; + stop_mom_ = start_mom_ + Moment (count) * body_length_; + next_moment_ = start_mom_ + body_length_; + + SCM m = get_property ("measureLength"); + Moment meas_len; + if (Moment *mp = unsmob_moment (m)) + meas_len = *mp; + + if (body_length_ < meas_len + && meas_len.main_part_.mod_rat (body_length_.main_part_) + == Moment (Rational (0,0))) + { + repeat_ = rp; + } + else + return false; + + Global_translator *global =top_engraver(); + for (int i = 0; i < count; i++) + global->add_moment_to_process (next_moment_ + Moment (i) * body_length_); + + return true; + } + + return false; +} + +void +Slash_repeat_engraver::process_music () +{ + if (repeat_ && now_mom () == next_moment_) + { + beat_slash_ = new Item (get_property ("RepeatSlash")); + announce_grob(beat_slash_, repeat_->self_scm()); + next_moment_ = next_moment_ + body_length_; + + top_engraver()->add_moment_to_process (next_moment_); + } +} + + +void +Slash_repeat_engraver::start_translation_timestep () +{ + if (stop_mom_ == now_mom ()) + { + repeat_ = 0; + } +} + +void +Slash_repeat_engraver::stop_translation_timestep () +{ + if (beat_slash_) + { + typeset_grob (beat_slash_); + beat_slash_ = 0; + } +} + + + + +ENTER_DESCRIPTION(Slash_repeat_engraver, +/* descr */ "Make beat repeats.", +/* creats*/ "RepeatSlash", +/* accepts */ "repeated-music", +/* acks */ "", +/* reads */ "measureLength currentCommandColumn", +/* write */ ""); diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 72066fe251..cda7218df9 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -168,6 +168,7 @@ VoiceContext = \translator { \consists "New_fingering_engraver" \consists "Chord_tremolo_engraver" \consists "Percent_repeat_engraver" + \consists "Slash_repeat_engraver" \consists "Melisma_engraver" %{ -- 2.39.2