From 3b963e7de14816666287b7a2bcfd35eccef977c4 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Sun, 2 Jun 2002 23:13:27 +0000 Subject: [PATCH] nested grace beams --- ChangeLog | 8 ++- Documentation/regression-test.tely | 5 +- input/bugs/nested-grace-beam.ly | 25 --------- input/regression/beam-manual.ly | 22 ++++++++ input/regression/grace-beam.ly | 9 ++++ lily/beam-engraver.cc | 87 +++++++++++++++++++++++++++--- lily/beam.cc | 10 ++-- ly/engraver-init.ly | 1 + make/lilypond.redhat.spec.in | 6 ++- scm/grob-description.scm | 1 - 10 files changed, 130 insertions(+), 44 deletions(-) delete mode 100644 input/bugs/nested-grace-beam.ly create mode 100644 input/regression/beam-manual.ly create mode 100644 input/regression/grace-beam.ly diff --git a/ChangeLog b/ChangeLog index ad3eab6108..3a2213babb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2002-06-03 Han-Wen + + * lily/beam-engraver.cc (class Grace_beam_engraver): derive from + beam-engraver: use different engraver so we can mix normal and + grace beams. + 2002-06-01 Han-Wen * lily/beam.cc (shift_region_to_valid): Try to shift positions @@ -17,7 +23,7 @@ 2002-05-31 Han-Wen * scripts/musedata2ly.py (Parser.parse_note_line): add dots. Add - note that missing features are excercise for user. + notice that missing features are exercise for user. 2002-05-30 Jan Nieuwenhuizen diff --git a/Documentation/regression-test.tely b/Documentation/regression-test.tely index c674844178..b7ad78bc7d 100644 --- a/Documentation/regression-test.tely +++ b/Documentation/regression-test.tely @@ -121,6 +121,8 @@ Grace note do weird things with timing. Fragile. @lilypondfile[printfilename]{grace.ly} +@lilypondfile[printfilename]{grace-beam.ly} + @lilypondfile[printfilename]{grace-bar-line.ly} @lilypondfile[printfilename]{grace-nest2.ly} @@ -146,13 +148,14 @@ Grace note do weird things with timing. Fragile. @lilypondfile[printfilename]{beam-concave.ly} +@lilypondfile[printfilename]{beam-manual.ly} + @lilypondfile[printfilename]{beam-extreme.ly} @lilypondfile[printfilename]{beam-position.ly} @lilypondfile[printfilename]{beam-center-slope.ly} - @lilypondfile[printfilename]{auto-beam-bar.ly} @lilypondfile[printfilename]{beam-over-barline.ly} diff --git a/input/bugs/nested-grace-beam.ly b/input/bugs/nested-grace-beam.ly deleted file mode 100644 index f7683a233a..0000000000 --- a/input/bugs/nested-grace-beam.ly +++ /dev/null @@ -1,25 +0,0 @@ - - -\header{ -texidoc = "Grace notes may separate beams, underneath normal beams." -} - -% -% TODO: add this to standard lilypond -% - -\score{ -\notes\context Voice{ - \time 6/8 - \clef violin - \key es \major - [a'8 ( \context GraceVoice \grace { [bes'16 a'16] } g'8 ) a'8] d''4 c''8 | -} -\paper { \translator { \VoiceContext - \accepts GraceVoice - } - \translator { \VoiceContext \name GraceVoice } - linewidth = -1. - } -} - diff --git a/input/regression/beam-manual.ly b/input/regression/beam-manual.ly new file mode 100644 index 0000000000..5aa6ed6e82 --- /dev/null +++ b/input/regression/beam-manual.ly @@ -0,0 +1,22 @@ + +\header { + + texidoc = "Beam positions may be set by hand by overriding + positions. No processing (quanting, damping) whatsoever is done " + +} + +\score { + \context Staff = up { + \notes\relative c'{ + \property Voice.Beam \override #'auto-knee-gap = ##f + \property Voice.Beam \override #'positions = #'(-10 . 10) + \stemUp + [c16 c'' a f] + + } + } + \paper{ + linewidth = -1 + } +} diff --git a/input/regression/grace-beam.ly b/input/regression/grace-beam.ly new file mode 100644 index 0000000000..2a680b37bc --- /dev/null +++ b/input/regression/grace-beam.ly @@ -0,0 +1,9 @@ +\header +{ +texidoc = "Grace beams and normal beams may occur simultaneously. +Unbeamed grace notes are not put into normal beams. +" +} + +\version "1.5.59" +\score { \notes\relative c'' { c4 [d8 \grace { [e32 d c d] } e8] [e e \grace { f16 } e8 e] }} diff --git a/lily/beam-engraver.cc b/lily/beam-engraver.cc index 9049454397..d389789d3a 100644 --- a/lily/beam-engraver.cc +++ b/lily/beam-engraver.cc @@ -21,6 +21,7 @@ class Beam_engraver : public Engraver { +protected: Drul_array reqs_drul_; Spanner *finished_beam_p_; @@ -40,7 +41,11 @@ class Beam_engraver : public Engraver void typeset_beam (); void set_melisma (bool); -protected: + + Moment last_stem_added_at_; + + + virtual void stop_translation_timestep (); virtual void start_translation_timestep (); virtual void finalize (); @@ -49,11 +54,30 @@ protected: virtual bool try_music (Music*); virtual void process_music (); + virtual bool valid_start_moment(); + virtual bool valid_end_moment (); + public: TRANSLATOR_DECLARATIONS( Beam_engraver ); }; + +bool +Beam_engraver::valid_start_moment() +{ + Moment n = now_mom (); + + return n.grace_part_ == Rational (0); +} + +bool +Beam_engraver::valid_end_moment() +{ + return last_stem_added_at_.grace_part_ == Rational(0); +} + + Beam_engraver::Beam_engraver () { beam_p_ = 0; @@ -80,11 +104,17 @@ Beam_engraver::try_music (Music *m) beam_p_ = 0; } else if (scm_equal_p (c->get_mus_property ("span-type"), - ly_str02scm ("beam")) == SCM_BOOL_T) + ly_str02scm ("beam")) == SCM_BOOL_T) { - Direction d =c->get_span_dir (); + + if (d == STOP && !valid_end_moment()) + return false; + + if (d == START && !valid_start_moment ()) + return false; + if (d == STOP) { SCM m = get_property ("automaticMelismata"); @@ -113,8 +143,6 @@ Beam_engraver::process_music () { if (reqs_drul_[STOP]) { - if (!beam_p_) - reqs_drul_[STOP]->origin ()->warning (_ ("can't find start of beam")); prev_start_req_ =0; finished_beam_p_ = beam_p_; finished_beam_info_p_ = beam_info_p_; @@ -223,7 +251,7 @@ Beam_engraver::acknowledge_grob (Grob_info info) { Moment now = now_mom(); - if(bool (now.grace_part_ ) != bool (beam_start_mom_.grace_part_)) + if (!valid_start_moment ()) return ; Item *stem_l = dynamic_cast (info.grob_l_); @@ -242,7 +270,9 @@ Beam_engraver::acknowledge_grob (Grob_info info) return; } - int durlog = unsmob_duration (rhythmic_req->get_mus_property ("duration"))-> duration_log (); + + last_stem_added_at_ = now; + int durlog = unsmob_duration (rhythmic_req->get_mus_property ("duration"))-> duration_log (); if (durlog <= 2) { rhythmic_req->origin ()->warning (_ ("stem doesn't fit in beam")); @@ -275,3 +305,46 @@ printed with flags instead of beams.", /* acks */ "stem-interface rest-interface", /* reads */ "beamMelismaBusy subdivideBeams", /* write */ ""); + + +class Grace_beam_engraver : public Beam_engraver +{ +public: + TRANSLATOR_DECLARATIONS(Grace_beam_engraver); + +protected: + virtual bool valid_start_moment(); + virtual bool valid_end_moment (); +}; + +Grace_beam_engraver::Grace_beam_engraver() +{ +} + +bool +Grace_beam_engraver::valid_start_moment() +{ + Moment n = now_mom (); + + return n.grace_part_ != Rational (0); +} + + +bool +Grace_beam_engraver::valid_end_moment () +{ + return beam_p_ && last_stem_added_at_.grace_part_ != Rational(0); +} + + + +ENTER_DESCRIPTION(Grace_beam_engraver, +/* descr */ "Handles Beam_requests by engraving Beams. If omitted, then notes will +be printed with flags instead of beams. Only engraves beams when we +are at grace points in time. +", +/* creats*/ "Beam", +/* acks */ "stem-interface rest-interface", +/* reads */ "beamMelismaBusy subdivideBeams", +/* write */ ""); + diff --git a/lily/beam.cc b/lily/beam.cc index c24d348c00..eba9e63373 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -347,13 +347,9 @@ Beam::set_stem_shorten (Grob *m) } /* Call list of y-dy-callbacks, that handle setting of - grob-properties y, dy. - - User may set grob-properties: y-position-hs and height-hs - (to be fixed) that override the calculated y and dy. - - Because y and dy cannot be calculated and quanted separately, we - always calculate both, then check for user override. */ + grob-properties + +*/ MAKE_SCHEME_CALLBACK (Beam, after_line_breaking, 1); SCM Beam::after_line_breaking (SCM smob) diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index aeed2f96e5..c4781277e7 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -137,6 +137,7 @@ VoiceContext = \translator { % \consists "Rest_engraver" \consists "Stem_engraver" \consists "Beam_engraver" + \consists "Grace_beam_engraver" \consists "Auto_beam_engraver" \consists "Chord_tremolo_engraver" diff --git a/make/lilypond.redhat.spec.in b/make/lilypond.redhat.spec.in index 26ce07e4c8..df3de73e08 100644 --- a/make/lilypond.redhat.spec.in +++ b/make/lilypond.redhat.spec.in @@ -13,8 +13,10 @@ URL: http://www.lilypond.org/ BuildRoot: /tmp/lilypond-install # add lots of Buildreq: flex, bison, tetex, tetex-devel, tetex-latex, texinfo -# better prereqs: tetex-latex, python, (mpost?) etc. -Prereq: tetex t1utils bison flex pktrace texinfo tetex-latex gcc-c++ python +Prereq: tetex tetex-latex gcc-c++ python + +# +Buildreq: t1utils bison flex pktrace texinfo %description LilyPond lets you create music notation. It produces diff --git a/scm/grob-description.scm b/scm/grob-description.scm index dae0d5d8a2..0b64c026c3 100644 --- a/scm/grob-description.scm +++ b/scm/grob-description.scm @@ -112,7 +112,6 @@ (position-callbacks . (,Beam::least_squares ,Beam::check_concave ,Beam::slope_damping - ,Beam::shift_region_to_valid ,Beam::quanting )) -- 2.39.5