X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fvoice-devnull-engraver.cc;h=d7027086bf570d4c52d025aea7b325d7074323d2;hb=refs%2Ftags%2Frelease%2F1.7.18;hp=9869784a70b15e9234954a8425ffec1143660722;hpb=0119396bf047bbc0a6debd06f48e6d18573e2303;p=lilypond.git diff --git a/lily/voice-devnull-engraver.cc b/lily/voice-devnull-engraver.cc index 9869784a70..d7027086bf 100644 --- a/lily/voice-devnull-engraver.cc +++ b/lily/voice-devnull-engraver.cc @@ -3,30 +3,38 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2001 Jan Nieuwenhuizen + (c) 2000--2003 Jan Nieuwenhuizen */ #include "engraver.hh" #include "item.hh" -#include "musical-request.hh" +#include "event.hh" #include "translator-group.hh" class Voice_devnull_engraver : public Engraver { public: - VIRTUAL_COPY_CONS (Translator); + TRANSLATOR_DECLARATIONS(Voice_devnull_engraver); protected: virtual bool try_music (Music *m); virtual void acknowledge_grob (Grob_info); }; -ADD_THIS_TRANSLATOR (Voice_devnull_engraver); +/* + +ARGH . + + +This really sucks. + + */ static char const *eat_spanners[] = { "beam", "crescendo", "decrescendo", + "rest", "slur", 0 }; @@ -35,35 +43,36 @@ bool Voice_devnull_engraver::try_music (Music *m) { SCM s = get_property ("devNullVoice"); + #if 0 /* No need */ if (gh_equal_p (s, ly_symbol2scm ("never"))) return; #endif - if (gh_equal_p (s, ly_symbol2scm ("allways")) + if (gh_equal_p (s, ly_symbol2scm ("always")) || (s == SCM_EOL - && daddy_trans_l_->id_str_.left_str (3) == "two" + && daddy_trans_->id_string_.left_string (3) == "two" && (to_boolean (get_property ("unison")) || to_boolean (get_property ("unisilence"))))) { - if (Span_req *s = dynamic_cast (m)) + if (m->is_mus_type ("span-event")) { - SCM t = s->get_mus_property ("span-type"); - + SCM t = m->get_mus_property ("span-type"); + for (char const **p = eat_spanners; *p; p++) { - if (t == ly_str02scm (*p)) + if (t == scm_makfrom0str (*p)) return true; } } - /* Ugh. Should eat other requests, script etc. too. */ - else if (Tie_req *t = dynamic_cast (m)) + /* Ugh. Should eat other events, script etc. too. */ + else if (m->is_mus_type ("tie-event")) return true; } return false; } - + static char const *junk_interfaces[] = { "beam-interface", "dynamic-interface", @@ -89,24 +98,39 @@ Voice_devnull_engraver::acknowledge_grob (Grob_info i) return; #endif - if (s == ly_symbol2scm ("allways") +#if 0 /* We used to have have this until 1.5.68. Not sure about + soloADue requirement */ + if (s == ly_symbol2scm ("always") || (s == SCM_EOL - && daddy_trans_l_->id_str_.left_str (3) == "two" + && daddy_trans_->id_string_.left_string (3) == "two" && (to_boolean (get_property ("unison")) || to_boolean (get_property ("unisilence"))))) +#else + if (s == ly_symbol2scm ("always") + || (s == SCM_EOL + && to_boolean (get_property ("soloADue")) + && ((daddy_trans_->id_string_.left_string (3) == "two" + && (to_boolean (get_property ("unison")) + || to_boolean (get_property ("unisilence")))) + + /* Maybe this should be optional? */ + || to_boolean (get_property ("othersolo"))))) +#endif + for (char const **p = junk_interfaces; *p; p++) - if (i.elem_l_->has_interface (ly_symbol2scm (*p))) + if (i.grob_->internal_has_interface (ly_symbol2scm (*p))) { -#if 0 - /* Ugh: virtual mmrest::suicide () ? */ - if (i.elem_l_->has_interface (ly_symbol2scm ("multi-measure-rest-interface"))) - i.elem_l_->set_grob_property ("skip-timestep", SCM_BOOL_T); - else - ; -#endif - /* Ugh, we can suicide them, but they remain living */ - i.elem_l_->suicide (); + i.grob_->suicide (); return; } } +Voice_devnull_engraver::Voice_devnull_engraver(){} + +ENTER_DESCRIPTION(Voice_devnull_engraver, +/* descr */ "Kill off certain items and spanners if we're Voice `two' and unison or unisilence is set.", +/* creats*/ "", +/* accepts */ "general-music", /*UGH.*/ +/* acks */ "grob-interface", +/* reads */ "", +/* write */ "");