21 #include "gtk2ardour-config.h"
41 #include "canvas/canvas.h"
42 #include "canvas/item.h"
43 #include "canvas/line_set.h"
68 for (Marks::iterator x = metric_marks.begin(); x != metric_marks.end(); ++x) {
71 metric_marks.clear ();
82 remove_metric_marks ();
84 for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
86 if ((ms = dynamic_cast<const MeterSection*>(*i)) != 0) {
89 *(const_cast<MeterSection*>(ms))));
90 }
else if ((ts = dynamic_cast<const TempoSection*>(*i)) != 0) {
97 *(const_cast<TempoSection*>(ts))));
114 tempo_lines->tempo_map_changed();
117 ARDOUR::TempoMap::BBTPointList::const_iterator begin;
118 ARDOUR::TempoMap::BBTPointList::const_iterator end;
120 compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(), begin, end);
122 draw_measures (begin, end);
123 update_tempo_based_rulers (begin, end);
133 if (immediate_redraw) {
134 ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin;
135 ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end;
137 compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(),
138 current_bbt_points_begin, current_bbt_points_end);
139 draw_measures (current_bbt_points_begin, current_bbt_points_end);
140 update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end);
143 Glib::signal_idle().connect (sigc::bind_return (sigc::bind (sigc::mem_fun (*
this, &
Editor::redisplay_tempo),
true),
false));
149 ARDOUR::TempoMap::BBTPointList::const_iterator& begin,
150 ARDOUR::TempoMap::BBTPointList::const_iterator& end)
159 _session->tempo_map().get_grid (begin, end, max (leftmost, (
framepos_t) 0), rightmost);
172 ARDOUR::TempoMap::BBTPointList::const_iterator& end)
174 if (_session == 0 || _show_measures ==
false || distance (begin, end) == 0) {
178 if (tempo_lines == 0) {
179 tempo_lines =
new TempoLines (time_line_group, ArdourCanvas::LineSet::Vertical);
182 const unsigned divisions = get_grid_beat_divisions(leftmost_frame);
183 tempo_lines->draw (begin, end, divisions, leftmost_frame, _session->frame_rate());
193 TempoMap& map(_session->tempo_map());
199 switch (tempo_dialog.run()) {
200 case RESPONSE_ACCEPT:
207 Timecode::BBT_Time requested;
209 bpm = tempo_dialog.get_bpm ();
210 double nt = tempo_dialog.get_note_type();
211 bpm = max (0.01, bpm);
213 tempo_dialog.get_bbt_time (requested);
215 begin_reversible_command (
_(
"add tempo mark"));
216 XMLNode &before = map.get_state();
217 map.add_tempo (
Tempo (bpm,nt), requested);
218 XMLNode &after = map.get_state();
220 commit_reversible_command ();
233 TempoMap& map(_session->tempo_map());
239 switch (meter_dialog.run ()) {
240 case RESPONSE_ACCEPT:
246 double bpb = meter_dialog.get_bpb ();
247 bpb = max (1.0, bpb);
249 double note_type = meter_dialog.get_note_type ();
250 Timecode::BBT_Time requested;
252 meter_dialog.get_bbt_time (requested);
254 begin_reversible_command (
_(
"add meter mark"));
255 XMLNode &before = map.get_state();
256 map.add_meter (
Meter (bpb, note_type), requested);
258 commit_reversible_command ();
269 if ((marker = reinterpret_cast<Marker *> (item->get_data (
"marker"))) == 0) {
270 fatal <<
_(
"programming error: tempo marker canvas item has no marker object pointer!") <<
endmsg;
274 if ((tempo_marker = dynamic_cast<TempoMarker*> (marker)) == 0) {
275 fatal <<
_(
"programming error: marker for tempo is not a tempo marker!") <<
endmsg;
289 switch (meter_dialog.run()) {
290 case RESPONSE_ACCEPT:
296 double bpb = meter_dialog.
get_bpb ();
297 bpb = max (1.0, bpb);
301 Timecode::BBT_Time when;
304 begin_reversible_command (
_(
"replace tempo mark"));
305 XMLNode &before = _session->tempo_map().get_state();
306 _session->tempo_map().replace_meter (*section,
Meter (bpb, note_type), when);
307 XMLNode &after = _session->tempo_map().get_state();
309 commit_reversible_command ();
317 switch (tempo_dialog.run ()) {
318 case RESPONSE_ACCEPT:
324 double bpm = tempo_dialog.
get_bpm ();
326 Timecode::BBT_Time when;
328 bpm = max (0.01, bpm);
330 begin_reversible_command (
_(
"replace tempo mark"));
331 XMLNode &before = _session->tempo_map().get_state();
332 _session->tempo_map().replace_tempo (*section,
Tempo (bpm, nt), when);
333 XMLNode &after = _session->tempo_map().get_state();
335 commit_reversible_command ();
341 edit_tempo_section (&tm.
tempo());
347 edit_meter_section (&mm.
meter());
353 begin_reversible_command (
_(
"remove tempo mark"));
354 XMLNode &before = _session->tempo_map().get_state();
355 _session->tempo_map().remove_tempo (*section,
true);
356 XMLNode &after = _session->tempo_map().get_state();
358 commit_reversible_command ();
369 if ((marker = reinterpret_cast<Marker *> (item->get_data (
"marker"))) == 0) {
370 fatal <<
_(
"programming error: meter marker canvas item has no marker object pointer!") <<
endmsg;
374 if ((meter_marker = dynamic_cast<MeterMarker*> (marker)) == 0) {
375 fatal <<
_(
"programming error: marker for meter is not a meter marker!") <<
endmsg;
387 begin_reversible_command (
_(
"remove tempo mark"));
388 XMLNode &before = _session->tempo_map().get_state();
389 _session->tempo_map().remove_meter (*section,
true);
390 XMLNode &after = _session->tempo_map().get_state();
392 commit_reversible_command ();
LIBPBD_API Transmitter fatal
gint real_remove_meter_marker(ARDOUR::MeterSection *)
void redisplay_tempo(bool immediate_redraw)
void edit_meter_section(ARDOUR::MeterSection *)
void mouse_add_new_tempo_event(framepos_t where)
std::list< MetricSection * > Metrics
void edit_tempo_section(ARDOUR::TempoSection *)
ARDOUR::TempoSection & tempo() const
std::ostream & endmsg(std::ostream &ostr)
void edit_meter_marker(MeterMarker &)
gint real_remove_tempo_marker(ARDOUR::TempoSection *)
#define ENSURE_GUI_THREAD(obj, method,...)
void mouse_add_new_meter_event(framepos_t where)
bool get_bbt_time(Timecode::BBT_Time &)
void delete_when_idle(T *obj)
void remove_meter_marker(ArdourCanvas::Item *)
ARDOUR::MeterSection & meter() const
void remove_tempo_marker(ArdourCanvas::Item *)
void tempo_map_changed(const PBD::PropertyChange &)
double note_divisor() const
double beats_per_minute() const
void compute_current_bbt_points(framepos_t left, framepos_t right, ARDOUR::TempoMap::BBTPointList::const_iterator &begin, ARDOUR::TempoMap::BBTPointList::const_iterator &end)
static UIConfiguration * config()
bool get_bbt_time(Timecode::BBT_Time &)
double divisions_per_bar() const
void remove_metric_marks()
void draw_metric_marks(const ARDOUR::Metrics &metrics)
void draw_measures(ARDOUR::TempoMap::BBTPointList::const_iterator &begin, ARDOUR::TempoMap::BBTPointList::const_iterator &end)
void edit_tempo_marker(TempoMarker &)
LIBARDOUR_API PBD::PropertyDescriptor< bool > color