X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fvoice-devnull-engraver.cc;h=7a8d460f99c933b672028507c5e23e1c414faa7f;hb=5e963da4031a9efceda94f4969785bf6fa13048b;hp=a6684ed45416fa1fccf517d3f06eba82daa19e81;hpb=f1346920f64c571a1475d3ded295b9637560c6bc;p=lilypond.git diff --git a/lily/voice-devnull-engraver.cc b/lily/voice-devnull-engraver.cc index a6684ed454..7a8d460f99 100644 --- a/lily/voice-devnull-engraver.cc +++ b/lily/voice-devnull-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000 Jan Nieuwenhuizen + (c) 2000--2001 Jan Nieuwenhuizen */ #include "engraver.hh" @@ -17,32 +17,97 @@ public: VIRTUAL_COPY_CONS (Translator); protected: - virtual void acknowledge_element (Score_element_info); + virtual bool try_music (Music *m); + virtual void acknowledge_grob (Grob_info); }; ADD_THIS_TRANSLATOR (Voice_devnull_engraver); +static char const *eat_spanners[] = { + "beam", + "crescendo", + "decrescendo", + "slur", + 0 +}; + +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")) + || (s == SCM_EOL + && daddy_trans_l_->id_str_.left_str (3) == "two" + && (to_boolean (get_property ("unison")) + || to_boolean (get_property ("unisilence"))))) + { + if (Span_req *s = dynamic_cast (m)) + { + SCM t = s->get_mus_property ("span-type"); + + for (char const **p = eat_spanners; *p; p++) + { + if (t == ly_str02scm (*p)) + return true; + } + } + /* Ugh. Should eat other requests, script etc. too. */ + else if (dynamic_cast (m)) + return true; + } + return false; +} + static char const *junk_interfaces[] = { - // "beam-interface", + "beam-interface", + "dynamic-interface", + "hairpin-interface", + "multi-measure-rest-interface", + "script-interface", "slur-interface", - "tie-interface", + "text-interface", "text-item-interface", "text-script-interface", - "dynamic-interface", - "crescendo-interface", + "text-spanner-interface", + "tie-interface", 0 }; void -Voice_devnull_engraver::acknowledge_element (Score_element_info i) +Voice_devnull_engraver::acknowledge_grob (Grob_info i) { - if (daddy_trans_l_->id_str_ == "two" - && (to_boolean (get_property ("unison")) - || to_boolean (get_property ("unisilence")))) + SCM s = get_property ("devNullVoice"); +#if 0 + /* No need, next if will never be true */ + if (s == ly_symbol2scm ("never")) + return; +#endif + + if (s == ly_symbol2scm ("allways") + || (s == SCM_EOL + && daddy_trans_l_->id_str_.left_str (3) == "two" + && (to_boolean (get_property ("unison")) + || to_boolean (get_property ("unisilence"))))) for (char const **p = junk_interfaces; *p; p++) if (i.elem_l_->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 (); return; } } + +