]> git.donarmstrong.com Git - lilypond.git/blob - lily/beam-performer.cc
* Documentation/user/refman.itely (More stanzas): document slur
[lilypond.git] / lily / beam-performer.cc
1 /*
2   beam-performer.cc -- implement Beam_performer
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1996--2004 Jan Nieuwenhuizen <janneke@gnu.org>
7  */
8
9 #include "performer.hh"
10 #include "event.hh"
11 #include "audio-item.hh"
12 #include "audio-column.hh"
13 #include "global-translator.hh"
14 #include "warn.hh"
15
16 /**
17 Convert evs to audio beams.
18 */
19 class Beam_performer : public Performer {
20 public:
21   TRANSLATOR_DECLARATIONS(Beam_performer);
22   
23 protected:
24   virtual bool try_music (Music *ev) ;
25   virtual void start_translation_timestep ();
26   virtual void process_music ();
27   void set_melisma (bool);
28 private:
29   Music *start_ev_;
30   Music *now_stop_ev_;
31   bool beam_;
32 };
33
34 void 
35 Beam_performer::process_music ()
36 {
37   if (now_stop_ev_)
38     {
39       beam_ = false;
40     }
41
42   if (start_ev_)
43     {
44       if (beam_)
45         {
46           start_ev_->origin ()->warning (_ ("already have a beam"));
47           return;
48         }
49       
50       beam_ = true;
51       set_melisma (true);
52     }
53 }
54
55
56 void
57 Beam_performer::set_melisma (bool ml)
58 {
59   SCM b = get_property ("autoBeaming");
60   if (!to_boolean (b))
61     daddy_trans_->set_property ("beamMelismaBusy", ml ? SCM_BOOL_T :SCM_BOOL_F);
62 }
63
64
65 void
66 Beam_performer::start_translation_timestep ()
67 {
68   if (beam_)
69     {
70       set_melisma (true);
71     }
72   
73   start_ev_ = 0;
74   now_stop_ev_ = 0;
75 }
76
77
78  
79 bool
80 Beam_performer::try_music (Music *m)
81 {
82   if (m->is_mus_type ("beam-event"))
83     {
84       Direction d = to_dir (m->get_mus_property ("span-direction"));
85
86       if (d == START)
87         {
88           start_ev_ = m;
89         }
90       else if (d==STOP)
91         {
92           now_stop_ev_ = m;
93         }
94       return true;
95     }
96   return false;
97 }
98
99 ENTER_DESCRIPTION(Beam_performer,"","",
100                   "beam-event","","","");
101
102 Beam_performer::Beam_performer()
103 {
104   beam_ = false;
105 }