2 slur-grav.cc -- implement Slur_engraver
4 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
8 #include "musical-request.hh"
9 #include "slur-engraver.hh"
12 #include "note-column.hh"
15 Slur_engraver::do_try_music (Music
*req_l
)
17 if (Span_req
*sl
= dynamic_cast <Span_req
*> (req_l
))
19 if (sl
->span_type_str_
!= "slur")
21 new_slur_req_l_arr_
.push (sl
);
28 Slur_engraver::acknowledge_element (Score_element_info info
)
30 if (dynamic_cast<Note_column
*> (info
.elem_l_
))
32 Note_column
*col_l
=dynamic_cast<Note_column
*> (info
.elem_l_
) ;// ugh
33 for (int i
= 0; i
< slur_l_stack_
.size(); i
++)
34 slur_l_stack_
[i
]->add_column (col_l
);
35 for (int i
= 0; i
< end_slur_l_arr_
.size(); i
++)
36 end_slur_l_arr_
[i
]->add_column (col_l
);
41 Slur_engraver::do_removal_processing ()
43 for (int i
= 0; i
< slur_l_stack_
.size(); i
++)
45 typeset_element (slur_l_stack_
[i
]);
47 slur_l_stack_
.clear ();
48 for (int i
=0; i
< requests_arr_
.size(); i
++)
50 requests_arr_
[i
]->warning (_ ("unterminated slur"));
55 Slur_engraver::do_process_requests()
57 Array
<Slur
*> start_slur_l_arr_
;
58 for (int i
=0; i
< new_slur_req_l_arr_
.size(); i
++)
60 Span_req
* slur_req_l
= new_slur_req_l_arr_
[i
];
61 // end slur: move the slur to other array
62 if (slur_req_l
->span_dir_
== STOP
)
64 if (slur_l_stack_
.empty())
66 slur_req_l
->warning (_f ("can't find both ends of %s", _("slur")));
69 end_slur_l_arr_
.push (slur_l_stack_
.pop());
73 else if (slur_req_l
->span_dir_
== START
)
75 // push a new slur onto stack.
76 //(use temp. array to wait for all slur STOPs)
78 Scalar prop
= get_property ("slurdash", 0);
80 s_p
->set_elt_property (dashed_scm_sym
, gh_int2scm(prop
));
82 requests_arr_
.push (slur_req_l
);
83 start_slur_l_arr_
.push (s_p
);
84 announce_element (Score_element_info (s_p
, slur_req_l
));
87 for (int i
=0; i
< start_slur_l_arr_
.size(); i
++)
88 slur_l_stack_
.push (start_slur_l_arr_
[i
]);
92 Slur_engraver::do_pre_move_processing()
94 Scalar
dir (get_property ("slurydirection", 0));
95 Scalar
dir2 (get_property ("ydirection", 0));
97 Direction slurdir
= CENTER
;
98 if (dir
.length_i () && dir
.isnum_b ())
99 slurdir
= (Direction
) sign (int(dir
));
100 else if (dir2
.length_i () && dir2
.isnum_b ())
101 slurdir
= (Direction
) sign (int (dir2
));
103 for (int i
= 0; i
< end_slur_l_arr_
.size(); i
++)
105 end_slur_l_arr_
[i
]->dir_
= slurdir
;
106 typeset_element (end_slur_l_arr_
[i
]);
108 end_slur_l_arr_
.clear();
112 Slur_engraver::do_post_move_processing()
114 new_slur_req_l_arr_
.clear();
118 ADD_THIS_TRANSLATOR(Slur_engraver
);