X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_tempodisplay.cc;h=488b804d654f97fcef25e5cd5633b0c9bfa8b814;hb=588cc3af74524a3f6bdae16c93ba0975f55fcc1e;hp=ac6c572af45434022233132bef9b48f74d3a0b11;hpb=ede4ecbb00ecc866c502454c81e711baea780ccd;p=ardour.git diff --git a/gtk2_ardour/editor_tempodisplay.cc b/gtk2_ardour/editor_tempodisplay.cc index ac6c572af4..488b804d65 100644 --- a/gtk2_ardour/editor_tempodisplay.cc +++ b/gtk2_ardour/editor_tempodisplay.cc @@ -17,6 +17,10 @@ */ +#ifdef WAF_BUILD +#include "gtk2ardour-config.h" +#endif + #include // for sprintf, grrr #include #include @@ -80,11 +84,15 @@ Editor::draw_metric_marks (const Metrics& metrics) for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { if ((ms = dynamic_cast(*i)) != 0) { - snprintf (buf, sizeof(buf), "%g/%g", ms->beats_per_bar(), ms->note_divisor ()); + snprintf (buf, sizeof(buf), "%g/%g", ms->divisions_per_bar(), ms->note_divisor ()); metric_marks.push_back (new MeterMarker (*this, *meter_group, ARDOUR_UI::config()->canvasvar_MeterMarker.get(), buf, *(const_cast(ms)))); } else if ((ts = dynamic_cast(*i)) != 0) { - snprintf (buf, sizeof (buf), "%.2f", ts->beats_per_minute()); + if (Config->get_allow_non_quarter_pulse()) { + snprintf (buf, sizeof (buf), "%.2f/%.0f", ts->beats_per_minute(), ts->note_type()); + } else { + snprintf (buf, sizeof (buf), "%.2f", ts->beats_per_minute()); + } metric_marks.push_back (new TempoMarker (*this, *tempo_group, ARDOUR_UI::config()->canvasvar_TempoMarker.get(), buf, *(const_cast(ts)))); } @@ -106,9 +114,13 @@ Editor::tempo_map_changed (const PropertyChange& /*ignored*/) tempo_lines->tempo_map_changed(); } - compute_current_bbt_points(leftmost_frame, leftmost_frame + current_page_frames()); + ARDOUR::TempoMap::BBTPointList::const_iterator begin; + ARDOUR::TempoMap::BBTPointList::const_iterator end; + + compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_frames(), begin, end); _session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks); // redraw metric markers redraw_measures (); + update_tempo_based_rulers (begin, end); } void @@ -118,9 +130,12 @@ Editor::redisplay_tempo (bool immediate_redraw) return; } - compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_frames()); // redraw rulers and measures + ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin; + ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end; + + compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_frames(), + current_bbt_points_begin, current_bbt_points_end); - compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_frames()); if (immediate_redraw) { redraw_measures (); } else { @@ -130,41 +145,22 @@ Editor::redisplay_tempo (bool immediate_redraw) Glib::signal_idle().connect (sigc::mem_fun (*this, &Editor::redraw_measures)); #endif } - update_tempo_based_rulers (); // redraw rulers and measures + update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end); // redraw rulers and measures } void -Editor::compute_current_bbt_points (nframes_t leftmost, nframes_t rightmost) +Editor::compute_current_bbt_points (framepos_t leftmost, framepos_t rightmost, + ARDOUR::TempoMap::BBTPointList::const_iterator& begin, + ARDOUR::TempoMap::BBTPointList::const_iterator& end) { if (!_session) { return; } - BBT_Time previous_beat, next_beat; // the beats previous to the leftmost frame and after the rightmost frame - - _session->bbt_time(leftmost, previous_beat); - _session->bbt_time(rightmost, next_beat); + /* prevent negative values of leftmost from creeping into tempomap + */ - if (previous_beat.beats > 1) { - previous_beat.beats -= 1; - } else if (previous_beat.bars > 1) { - previous_beat.bars--; - previous_beat.beats += 1; - } - previous_beat.ticks = 0; - - if (_session->tempo_map().meter_at(rightmost).beats_per_bar () > next_beat.beats + 1) { - next_beat.beats += 1; - } else { - next_beat.bars += 1; - next_beat.beats = 1; - } - next_beat.ticks = 0; - - delete current_bbt_points; - current_bbt_points = 0; - - current_bbt_points = _session->tempo_map().get_points (_session->tempo_map().frame_time (previous_beat), _session->tempo_map().frame_time (next_beat) + 1); + _session->tempo_map().get_grid (begin, end, max (leftmost, (framepos_t) 0), rightmost); } void @@ -177,15 +173,20 @@ Editor::hide_measures () bool Editor::redraw_measures () { - draw_measures (); + ARDOUR::TempoMap::BBTPointList::const_iterator begin; + ARDOUR::TempoMap::BBTPointList::const_iterator end; + + compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_frames(), begin, end); + draw_measures (begin, end); + return false; } void -Editor::draw_measures () +Editor::draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin, + ARDOUR::TempoMap::BBTPointList::const_iterator& end) { - if (_session == 0 || _show_measures == false || - !current_bbt_points || current_bbt_points->empty()) { + if (_session == 0 || _show_measures == false || distance (begin, end) == 0) { return; } @@ -193,7 +194,7 @@ Editor::draw_measures () tempo_lines = new TempoLines(*track_canvas, time_line_group, physical_screen_height(get_window())); } - tempo_lines->draw(*current_bbt_points, frames_per_unit); + tempo_lines->draw (begin, end, frames_per_unit); } void @@ -206,7 +207,6 @@ Editor::mouse_add_new_tempo_event (framepos_t frame) TempoMap& map(_session->tempo_map()); TempoDialog tempo_dialog (map, frame, _("add")); - tempo_dialog.set_position (Gtk::WIN_POS_MOUSE); //this causes compiz to display no border. //tempo_dialog.signal_realize().connect (sigc::bind (sigc::ptr_fun (set_decoration), &tempo_dialog, Gdk::WMDecoration (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH))); @@ -220,7 +220,7 @@ Editor::mouse_add_new_tempo_event (framepos_t frame) } double bpm = 0; - BBT_Time requested; + Timecode::BBT_Time requested; bpm = tempo_dialog.get_bpm (); double nt = tempo_dialog.get_note_type(); @@ -249,8 +249,6 @@ Editor::mouse_add_new_meter_event (framepos_t frame) TempoMap& map(_session->tempo_map()); MeterDialog meter_dialog (map, frame, _("add")); - meter_dialog.set_position (Gtk::WIN_POS_MOUSE); - //this causes compiz to display no border.. //meter_dialog.signal_realize().connect (sigc::bind (sigc::ptr_fun (set_decoration), &meter_dialog, Gdk::WMDecoration (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH))); @@ -267,7 +265,7 @@ Editor::mouse_add_new_meter_event (framepos_t frame) bpb = max (1.0, bpb); // XXX is this a reasonable limit? double note_type = meter_dialog.get_note_type (); - BBT_Time requested; + Timecode::BBT_Time requested; meter_dialog.get_bbt_time (requested); @@ -306,8 +304,6 @@ Editor::edit_meter_section (MeterSection* section) { MeterDialog meter_dialog (*section, _("done")); - meter_dialog.set_position (Gtk::WIN_POS_MOUSE); - ensure_float (meter_dialog); switch (meter_dialog.run()) { @@ -322,9 +318,12 @@ Editor::edit_meter_section (MeterSection* section) double note_type = meter_dialog.get_note_type (); + Timecode::BBT_Time when; + meter_dialog.get_bbt_time(when); + begin_reversible_command (_("replace tempo mark")); XMLNode &before = _session->tempo_map().get_state(); - _session->tempo_map().replace_meter (*section, Meter (bpb, note_type)); + _session->tempo_map().replace_meter (*section, Meter (bpb, note_type), when); XMLNode &after = _session->tempo_map().get_state(); _session->add_command(new MementoCommand(_session->tempo_map(), &before, &after)); commit_reversible_command (); @@ -335,8 +334,6 @@ Editor::edit_tempo_section (TempoSection* section) { TempoDialog tempo_dialog (*section, _("done")); - tempo_dialog.set_position (Gtk::WIN_POS_MOUSE); - ensure_float (tempo_dialog); switch (tempo_dialog.run ()) { @@ -348,18 +345,13 @@ Editor::edit_tempo_section (TempoSection* section) double bpm = tempo_dialog.get_bpm (); double nt = tempo_dialog.get_note_type (); - BBT_Time when; + Timecode::BBT_Time when; tempo_dialog.get_bbt_time(when); bpm = max (0.01, bpm); - cerr << "Editing tempo section to be at " << when << endl; - _session->tempo_map().dump (cerr); begin_reversible_command (_("replace tempo mark")); XMLNode &before = _session->tempo_map().get_state(); - _session->tempo_map().replace_tempo (*section, Tempo (bpm,nt)); - _session->tempo_map().dump (cerr); - _session->tempo_map().move_tempo (*section, when); - _session->tempo_map().dump (cerr); + _session->tempo_map().replace_tempo (*section, Tempo (bpm, nt), when); XMLNode &after = _session->tempo_map().get_state(); _session->add_command (new MementoCommand(_session->tempo_map(), &before, &after)); commit_reversible_command (); @@ -408,7 +400,7 @@ Editor::real_remove_tempo_marker (TempoSection *section) { begin_reversible_command (_("remove tempo mark")); XMLNode &before = _session->tempo_map().get_state(); - _session->tempo_map().remove_tempo (*section); + _session->tempo_map().remove_tempo (*section, true); XMLNode &after = _session->tempo_map().get_state(); _session->add_command(new MementoCommand(_session->tempo_map(), &before, &after)); commit_reversible_command (); @@ -442,7 +434,7 @@ Editor::real_remove_meter_marker (MeterSection *section) { begin_reversible_command (_("remove tempo mark")); XMLNode &before = _session->tempo_map().get_state(); - _session->tempo_map().remove_meter (*section); + _session->tempo_map().remove_meter (*section, true); XMLNode &after = _session->tempo_map().get_state(); _session->add_command(new MementoCommand(_session->tempo_map(), &before, &after)); commit_reversible_command ();