X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_tempodisplay.cc;h=b863cb99011d5377af837a5d008e522c44f35b3f;hb=04c484089c5f1ff064b111ce3e4f1e2ff7e7ec83;hp=fa7d22ec8983be55f5d311f5b266b58d4de8c689;hpb=8b0c5b8426497cc8e96d0d695efcd5ededdd419b;p=ardour.git diff --git a/gtk2_ardour/editor_tempodisplay.cc b/gtk2_ardour/editor_tempodisplay.cc index fa7d22ec89..b863cb9901 100644 --- a/gtk2_ardour/editor_tempodisplay.cc +++ b/gtk2_ardour/editor_tempodisplay.cc @@ -51,7 +51,7 @@ #include "tempo_lines.h" #include "ui_config.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; @@ -75,7 +75,11 @@ Editor::remove_metric_marks () } tempo_curves.clear (); } - +struct CurveComparator { + bool operator() (TempoCurve const * a, TempoCurve const * b) { + return a->tempo().frame() < b->tempo().frame(); + } +}; void Editor::draw_metric_marks (const Metrics& metrics) { @@ -91,17 +95,22 @@ Editor::draw_metric_marks (const Metrics& metrics) if ((ms = dynamic_cast(*i)) != 0) { snprintf (buf, sizeof(buf), "%g/%g", ms->divisions_per_bar(), ms->note_divisor ()); - metric_marks.push_back (new MeterMarker (*this, *meter_group, UIConfiguration::instance().color ("meter marker"), buf, - *(const_cast(ms)))); + if (ms->position_lock_style() == MusicTime) { + metric_marks.push_back (new MeterMarker (*this, *meter_group, UIConfiguration::instance().color ("meter marker music"), buf, + *(const_cast(ms)))); + } else { + metric_marks.push_back (new MeterMarker (*this, *meter_group, UIConfiguration::instance().color ("meter marker"), buf, + *(const_cast(ms)))); + } } else if ((ts = dynamic_cast(*i)) != 0) { if (UIConfiguration::instance().get_allow_non_quarter_pulse()) { - snprintf (buf, sizeof (buf), "%.3f/%.0f", ts->beats_per_minute(), ts->note_type()); + snprintf (buf, sizeof (buf), "%.3f/%.0f", ts->note_types_per_minute(), ts->note_type()); } else { - snprintf (buf, sizeof (buf), "%.3f", ts->beats_per_minute()); + snprintf (buf, sizeof (buf), "%.3f", ts->note_types_per_minute()); } - max_tempo = max (max_tempo, ts->beats_per_minute()); - min_tempo = min (min_tempo, ts->beats_per_minute()); + max_tempo = max (max_tempo, ts->note_types_per_minute()); + min_tempo = min (min_tempo, ts->note_types_per_minute()); tempo_curves.push_back (new TempoCurve (*this, *tempo_group, UIConfiguration::instance().color ("tempo curve"), *(const_cast(ts)), ts->frame(), false)); @@ -116,6 +125,7 @@ Editor::draw_metric_marks (const Metrics& metrics) } } + tempo_curves.sort (CurveComparator()); const double min_tempo_range = 5.0; const double tempo_delta = fabs (max_tempo - min_tempo); @@ -135,6 +145,13 @@ Editor::draw_metric_marks (const Metrics& metrics) } else { (*x)->set_position ((*x)->tempo().frame(), UINT32_MAX); } + + if (!(*x)->tempo().active()) { + (*x)->hide(); + } else { + (*x)->show(); + } + ++x; } @@ -142,7 +159,7 @@ Editor::draw_metric_marks (const Metrics& metrics) TempoMarker* tempo_marker; if ((tempo_marker = dynamic_cast (*x)) != 0) { - tempo_marker->update_height_mark ((tempo_marker->tempo().beats_per_minute() - min_tempo) / max (10.0, max_tempo - min_tempo)); + tempo_marker->update_height_mark ((tempo_marker->tempo().note_types_per_minute() - min_tempo) / max (10.0, max_tempo - min_tempo)); } } } @@ -161,21 +178,18 @@ Editor::tempo_map_changed (const PropertyChange& /*ignored*/) tempo_lines->tempo_map_changed(); } + compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples()); std::vector grid; - compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + if (bbt_ruler_scale != bbt_show_many) { + compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + } _session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks); // redraw metric markers draw_measures (grid); - update_tempo_based_rulers (grid); + update_tempo_based_rulers (); } -struct CurveComparator { - bool operator() (TempoCurve const * a, TempoCurve const * b) { - return a->position() < b->position(); - } -}; - void -Editor::marker_position_changed () +Editor::tempometric_position_changed (const PropertyChange& /*ignored*/) { if (!_session) { return; @@ -200,11 +214,17 @@ Editor::marker_position_changed () if ((ts = &tempo_marker->tempo()) != 0) { tempo_marker->set_position (ts->frame ()); char buf[64]; - snprintf (buf, sizeof (buf), "%.3f", ts->beats_per_minute()); + + if (UIConfiguration::instance().get_allow_non_quarter_pulse()) { + snprintf (buf, sizeof (buf), "%.3f/%.0f", ts->note_types_per_minute(), ts->note_type()); + } else { + snprintf (buf, sizeof (buf), "%.3f", ts->note_types_per_minute()); + } + tempo_marker->set_name (buf); - max_tempo = max (max_tempo, ts->beats_per_minute()); - min_tempo = min (min_tempo, ts->beats_per_minute()); + max_tempo = max (max_tempo, ts->note_types_per_minute()); + min_tempo = min (min_tempo, ts->note_types_per_minute()); } } if ((meter_marker = dynamic_cast (*x)) != 0) { @@ -234,20 +254,32 @@ Editor::marker_position_changed () } else { (*x)->set_position ((*x)->tempo().frame(), UINT32_MAX); } + + if (!(*x)->tempo().active()) { + (*x)->hide(); + } else { + (*x)->show(); + } + ++x; } for (Marks::iterator x = metric_marks.begin(); x != metric_marks.end(); ++x) { TempoMarker* tempo_marker; if ((tempo_marker = dynamic_cast (*x)) != 0) { - tempo_marker->update_height_mark ((tempo_marker->tempo().beats_per_minute() - min_tempo) / max (max_tempo - min_tempo, 10.0)); + tempo_marker->update_height_mark ((tempo_marker->tempo().note_types_per_minute() - min_tempo) / max (max_tempo - min_tempo, 10.0)); } } + compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples()); std::vector grid; - compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + + if (bbt_ruler_scale != bbt_show_many) { + compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + } + draw_measures (grid); - update_tempo_based_rulers (grid); + update_tempo_based_rulers (); } void @@ -258,11 +290,15 @@ Editor::redisplay_tempo (bool immediate_redraw) } if (immediate_redraw) { + compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples()); std::vector grid; - compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + if (bbt_ruler_scale != bbt_show_many) { + compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + } + draw_measures (grid); - update_tempo_based_rulers (grid); // redraw rulers and measure lines + update_tempo_based_rulers (); // redraw rulers and measure lines } else { Glib::signal_idle().connect (sigc::bind_return (sigc::bind (sigc::mem_fun (*this, &Editor::redisplay_tempo), true), false)); @@ -279,8 +315,37 @@ Editor::compute_current_bbt_points (std::vector& grid, frame /* prevent negative values of leftmost from creeping into tempomap */ - const double lower_beat = floor (_session->tempo_map().beat_at_frame (leftmost)) - 1.0; - _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost); + const double lower_beat = floor (max (0.0, _session->tempo_map().beat_at_frame (leftmost))) - 1.0; + switch (bbt_ruler_scale) { + + case bbt_show_beats: + case bbt_show_ticks: + case bbt_show_ticks_detail: + case bbt_show_ticks_super_detail: + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost); + break; + + case bbt_show_1: + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost, 1); + break; + + case bbt_show_4: + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost, 4); + break; + + case bbt_show_16: + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost, 16); + break; + + case bbt_show_64: + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost, 64); + break; + + default: + /* bbt_show_many */ + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost, 128); + break; + } } void @@ -316,7 +381,7 @@ Editor::mouse_add_new_tempo_event (framepos_t frame) TempoMap& map(_session->tempo_map()); begin_reversible_command (_("add tempo mark")); - const double pulse = map.pulse_at_frame (frame); + const double pulse = map.exact_qn_at_frame (frame, get_grid_music_divisions (0)) / 4.0; if (pulse > 0.0) { XMLNode &before = map.get_state(); @@ -353,17 +418,19 @@ 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 (); - Timecode::BBT_Time requested; + Timecode::BBT_Time requested; meter_dialog.get_bbt_time (requested); + const double beat = map.beat_at_bbt (requested); + const double al_frame = map.frame_at_beat (beat); begin_reversible_command (_("add meter mark")); XMLNode &before = map.get_state(); if (meter_dialog.get_lock_style() == MusicTime) { - map.add_meter (Meter (bpb, note_type), map.beat_at_bbt (requested), requested, 0, MusicTime); + map.add_meter (Meter (bpb, note_type), beat, requested, 0, MusicTime); } else { - map.add_meter (Meter (bpb, note_type), map.beat_at_bbt (requested), requested, map.frame_at_bbt (requested), AudioTime); + map.add_meter (Meter (bpb, note_type), beat, requested, al_frame, AudioTime); } _session->add_command(new MementoCommand(map, &before, &map.get_state())); @@ -388,7 +455,7 @@ Editor::remove_tempo_marker (ArdourCanvas::Item* item) abort(); /*NOTREACHED*/ } - if (tempo_marker->tempo().movable()) { + if (!tempo_marker->tempo().locked_to_meter() && tempo_marker->tempo().active()) { Glib::signal_idle().connect (sigc::bind (sigc::mem_fun(*this, &Editor::real_remove_tempo_marker), &tempo_marker->tempo())); } } @@ -409,14 +476,17 @@ Editor::edit_meter_section (MeterSection* section) bpb = max (1.0, bpb); // XXX is this a reasonable limit? double const note_type = meter_dialog.get_note_type (); + const Meter meter (bpb, note_type); + Timecode::BBT_Time when; meter_dialog.get_bbt_time (when); - framepos_t const frame = _session->tempo_map().frame_at_bbt (when); + const framepos_t frame = _session->tempo_map().frame_at_bbt (when); + const PositionLockStyle pls = (meter_dialog.get_lock_style() == AudioTime) ? AudioTime : MusicTime; begin_reversible_command (_("replace meter mark")); XMLNode &before = _session->tempo_map().get_state(); - _session->tempo_map().replace_meter (*section, Meter (bpb, note_type), when, frame, meter_dialog.get_lock_style()); + _session->tempo_map().replace_meter (*section, meter, when, frame, pls); XMLNode &after = _session->tempo_map().get_state(); _session->add_command(new MementoCommand(_session->tempo_map(), &before, &after)); @@ -437,21 +507,23 @@ Editor::edit_tempo_section (TempoSection* section) double bpm = tempo_dialog.get_bpm (); double nt = tempo_dialog.get_note_type (); - Timecode::BBT_Time when; + bpm = max (0.01, bpm); + const Tempo tempo (bpm, nt); + Timecode::BBT_Time when; tempo_dialog.get_bbt_time (when); - bpm = max (0.01, bpm); + const TempoSection::Type ttype (tempo_dialog.get_tempo_type()); begin_reversible_command (_("replace tempo mark")); XMLNode &before = _session->tempo_map().get_state(); if (tempo_dialog.get_lock_style() == AudioTime) { framepos_t const f = _session->tempo_map().predict_tempo_position (section, when).second; - _session->tempo_map().replace_tempo (*section, Tempo (bpm, nt), 0.0, f, tempo_dialog.get_tempo_type(), AudioTime); + _session->tempo_map().replace_tempo (*section, tempo, 0.0, f, ttype, AudioTime); } else { double const p = _session->tempo_map().predict_tempo_position (section, when).first; - _session->tempo_map().replace_tempo (*section, Tempo (bpm, nt), p, 0, tempo_dialog.get_tempo_type(), MusicTime); + _session->tempo_map().replace_tempo (*section, tempo, p, 0, ttype, MusicTime); } XMLNode &after = _session->tempo_map().get_state(); @@ -500,7 +572,7 @@ Editor::remove_meter_marker (ArdourCanvas::Item* item) abort(); /*NOTREACHED*/ } - if (meter_marker->meter().movable()) { + if (!meter_marker->meter().initial()) { Glib::signal_idle().connect (sigc::bind (sigc::mem_fun(*this, &Editor::real_remove_meter_marker), &meter_marker->meter())); } }