]> git.donarmstrong.com Git - lilypond.git/blob - lily/voice-devnull-engraver.cc
release: 1.5.29
[lilypond.git] / lily / voice-devnull-engraver.cc
1 /*
2   voice-devnull-engraver.cc -- implement Voice_devnull_engraver
3
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 2000--2002 Jan Nieuwenhuizen <janneke@gnu.org>
7 */
8
9 #include "engraver.hh"
10 #include "item.hh"
11 #include "musical-request.hh"
12 #include "translator-group.hh"
13
14 class Voice_devnull_engraver : public Engraver
15 {
16 public:
17   TRANSLATOR_DECLARATIONS(Voice_devnull_engraver);
18   
19 protected:
20   virtual bool try_music (Music *m);
21   virtual void acknowledge_grob (Grob_info);
22 };
23
24
25
26 static char const *eat_spanners[] = {
27   "beam",
28   "crescendo",
29   "decrescendo",
30   "slur",
31   0
32 };
33
34 bool
35 Voice_devnull_engraver::try_music (Music *m)
36 {
37   SCM s = get_property ("devNullVoice");
38 #if 0
39   /* No need */
40   if (gh_equal_p (s, ly_symbol2scm ("never")))
41     return;
42 #endif
43
44   if (gh_equal_p (s, ly_symbol2scm ("allways"))
45       || (s == SCM_EOL
46           && daddy_trans_l_->id_str_.left_str (3) == "two"
47           && (to_boolean (get_property ("unison"))
48               || to_boolean (get_property ("unisilence")))))
49     {
50       if (Span_req *s = dynamic_cast <Span_req *> (m))
51         {
52           SCM t = s->get_mus_property ("span-type");
53         
54           for (char const **p = eat_spanners; *p; p++)
55             {
56               if (t == ly_str02scm (*p))
57                 return true;
58             }
59         }
60       /* Ugh.  Should eat other requests, script etc. too. */  
61       else if (dynamic_cast<Tie_req*> (m))
62         return true;
63     }
64   return false;
65 }
66     
67 static char const *junk_interfaces[] = {
68   "beam-interface",
69   "dynamic-interface",
70   "hairpin-interface",
71   "multi-measure-rest-interface",
72   "script-interface",
73   "slur-interface",
74   "text-interface",
75   "text-item-interface",
76   "text-script-interface",
77   "text-spanner-interface",
78   "tie-interface",
79   0
80 };
81
82 void
83 Voice_devnull_engraver::acknowledge_grob (Grob_info i)
84 {
85   SCM s = get_property ("devNullVoice");
86 #if 0
87   /* No need, next if will never be true */
88   if (s == ly_symbol2scm ("never"))
89     return;
90 #endif
91
92   if (s == ly_symbol2scm ("allways")
93       || (s == SCM_EOL
94           && daddy_trans_l_->id_str_.left_str (3) == "two"
95           && (to_boolean (get_property ("unison"))
96               || to_boolean (get_property ("unisilence")))))
97     for (char const **p = junk_interfaces; *p; p++)
98       if (i.grob_l_->has_interface (ly_symbol2scm (*p)))
99         {
100 #if 0
101           /* Ugh: virtual mmrest::suicide () ? */
102           if (i.grob_l_->has_interface (ly_symbol2scm ("multi-measure-rest-interface")))
103             i.grob_l_->set_grob_property ("skip-timestep", SCM_BOOL_T);
104           else
105             ;
106 #endif    
107           /* Ugh, we can suicide them, but they remain living */
108           i.grob_l_->suicide ();
109           return;
110         }
111 }
112  
113 Voice_devnull_engraver::Voice_devnull_engraver(){}
114   
115 ENTER_DESCRIPTION(Voice_devnull_engraver,
116 /* descr */       "Kill off certain items and spanners if we're Voice `two' and unison or unisilence is set.",
117 /* creats*/       "",
118 /* acks  */       "grob-interface",
119 /* reads */       "",
120 /* write */       "");