]> git.donarmstrong.com Git - lilypond.git/blob - lily/chord-tremolo-engraver.cc
patch::: 1.3.14.hwn1
[lilypond.git] / lily / chord-tremolo-engraver.cc
1 /*
2   chord-tremolo-engraver.cc -- implement Chord_tremolo_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7            Jan Nieuwenhuizen <janneke@gnu.org>
8 */
9
10 #include "timing-translator.hh"
11 #include "chord-tremolo-engraver.hh"
12 #include "stem.hh"
13 #include "beam.hh"
14 #include "musical-request.hh"
15 #include "misc.hh"
16 #include "warn.hh"
17 #include "score-engraver.hh"
18
19 ADD_THIS_TRANSLATOR (Chord_tremolo_engraver);
20
21 Chord_tremolo_engraver::Chord_tremolo_engraver ()
22 {
23   reqs_drul_[LEFT] = reqs_drul_[RIGHT] = 0;
24   abeam_p_ = 0;
25   finished_abeam_p_ = 0;
26   prev_start_req_ = 0;
27 }
28
29 bool
30 Chord_tremolo_engraver::do_try_music (Music* m)
31 {
32   if (Chord_tremolo_req* b = dynamic_cast <Chord_tremolo_req *> (m))
33     {
34       Direction d = b->span_dir_;
35       if (reqs_drul_[d] && !reqs_drul_[d]->equal_b (b))
36         return false;
37
38       if ((d == STOP) && !abeam_p_)
39         {
40           m->warning (_ ("no tremolo beam to end"));
41           return false;
42         }
43
44       reqs_drul_[d] = b;
45       return true;
46     }
47
48   return false;
49 }
50
51 void
52 Chord_tremolo_engraver::do_process_requests ()
53 {
54   if (reqs_drul_[STOP])
55     {
56       if (!abeam_p_)
57         reqs_drul_[STOP]->warning (_ ("no tremolo beam to end"));
58       prev_start_req_ = 0;
59       finished_abeam_p_ = abeam_p_;
60       abeam_p_ = 0;
61     }
62
63   if (abeam_p_)
64     {
65       Score_engraver * e = 0;
66       Translator * t  =  daddy_grav_l ();
67       for (; !e && t;  t = t->daddy_trans_l_)
68         {
69           e = dynamic_cast<Score_engraver*> (t);
70         }
71       
72       if (!e)
73         programming_error ("No score engraver!");
74       else
75         e->forbid_breaks ();
76     }
77
78   if (reqs_drul_[START])
79     {
80       if (abeam_p_)
81         {
82           reqs_drul_[START]->warning (_ ("Already have a tremolo beam"));
83           return;
84         }
85
86       prev_start_req_ = reqs_drul_[START];
87
88       abeam_p_ = new Beam;
89       abeam_p_->set_elt_property ("chord-tremolo", SCM_BOOL_T);
90       
91       announce_element (Score_element_info (abeam_p_, reqs_drul_[LEFT]));
92   }
93 }
94
95 void
96 Chord_tremolo_engraver::do_post_move_processing ()
97 {
98   reqs_drul_ [START] = 0;
99 }
100
101 void
102 Chord_tremolo_engraver::do_pre_move_processing ()
103 {
104   typeset_beam ();
105 }
106
107 void
108 Chord_tremolo_engraver::typeset_beam ()
109 {
110   if (finished_abeam_p_)
111     {
112       typeset_element (finished_abeam_p_);
113       finished_abeam_p_ = 0;
114
115       reqs_drul_[STOP] = 0;
116     }
117 }
118
119 void
120 Chord_tremolo_engraver::do_removal_processing ()
121 {
122   typeset_beam ();
123   if (abeam_p_)
124     {
125       prev_start_req_->warning (_ ("unfinished tremolo beam"));
126       finished_abeam_p_ = abeam_p_;
127       typeset_beam ();
128     }
129 }
130
131 void
132 Chord_tremolo_engraver::acknowledge_element (Score_element_info i)
133 {
134   if (abeam_p_)
135     {
136       if (Stem* s = dynamic_cast<Stem *> (i.elem_l_))
137         {
138           int type_i = prev_start_req_->type_i_;
139           s->set_elt_property ("duration-log",  gh_int2scm (intlog2 (type_i) - 2));
140
141           s->set_beaming (s->flag_i (), LEFT);
142           s->set_beaming ( s->flag_i (), RIGHT);
143           
144
145 #if 0
146           if (s->type_i () != 1)
147             {
148               int gap_i =s->flag_i () - ((s->type_i () >? 2) - 2);
149               s->set_elt_property ("beam-gap", gh_int2scm(gap_i));
150             }
151 #else
152           if (s->type_i () != 1)
153             {
154               int gap_i =s->flag_i () - ((s->type_i () >? 2) - 2);
155               abeam_p_->set_elt_property ("beam-gap", gh_int2scm(gap_i));
156             }
157 #endif
158           
159           abeam_p_->add_stem (s);
160         }
161     }
162 }
163