From ee6ecf903425f8e3821e20b43c337cb9558c74f5 Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Tue, 3 Feb 2015 19:33:22 +0000 Subject: A few whitespace fixes A few trivial whitesapce fixes, including replacing leading spaces with tabs in editor.h. --- gtk2_ardour/ardour_ui.h | 2 +- gtk2_ardour/editor.cc | 7 ++- gtk2_ardour/editor.h | 142 +++++++++++++++++++++++------------------------- 3 files changed, 74 insertions(+), 77 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 0e039e55d1..31d97bad12 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -180,7 +180,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr static ARDOUR_UI *instance () { return theArdourUI; } static UIConfiguration *config () { return theArdourUI->ui_config; } - PublicEditor& the_editor(){return *editor;} + PublicEditor& the_editor() { return *editor;} Mixer_UI* the_mixer() { return mixer; } void new_midi_tracer_window (); diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index a66972a7e9..231bb088d1 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -4644,9 +4644,9 @@ Editor::get_preferred_edit_position (bool ignore_playhead, bool from_context_men framepos_t where = 0; EditPoint ep = _edit_point; - if(Profile->get_mixbus()) + if (Profile->get_mixbus()) if (ep == EditAtSelectedMarker) - ep=EditAtPlayhead; + ep = EditAtPlayhead; if (from_outside_canvas && (ep == EditAtMouse)) { ep = EditAtPlayhead; @@ -4670,8 +4670,9 @@ Editor::get_preferred_edit_position (bool ignore_playhead, bool from_context_men /* XXX not right but what can we do ? */ return 0; } - } else + } else { where = _session->audible_frame(); + } DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("GPEP: use playhead @ %1\n", where)); break; diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 6fd2c7d96a..bd5f3816fb 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -286,9 +286,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void set_zoom_focus (Editing::ZoomFocus); Editing::ZoomFocus get_zoom_focus () const { return zoom_focus; } framecnt_t get_current_zoom () const { return samples_per_pixel; } - void cycle_zoom_focus (); + void cycle_zoom_focus (); void temporal_zoom_step (bool coarser); - void ensure_time_axis_view_is_visible (TimeAxisView const & tav, bool at_top); + void ensure_time_axis_view_is_visible (TimeAxisView const & tav, bool at_top); void tav_zoom_step (bool coarser); void tav_zoom_smooth (bool coarser, bool force_all); @@ -363,8 +363,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void scroll_tracks_down_line (); void scroll_tracks_up_line (); - bool scroll_up_one_track (); - bool scroll_down_one_track (); + bool scroll_up_one_track (); + bool scroll_down_one_track (); void prepare_for_cleanup (); void finish_cleanup (); @@ -419,7 +419,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD framepos_t& pos, boost::shared_ptr instrument = boost::shared_ptr()); - void get_regions_corresponding_to (boost::shared_ptr region, std::vector& regions, bool src_comparison); + void get_regions_corresponding_to (boost::shared_ptr region, std::vector& regions, bool src_comparison); void get_regionviews_by_id (PBD::ID const id, RegionSelection & regions) const; void get_per_region_note_selection (std::list > > > >&) const; @@ -459,8 +459,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD return _drags; } - void maybe_autoscroll (bool, bool, bool); - bool autoscroll_active() const; + void maybe_autoscroll (bool, bool, bool); + bool autoscroll_active() const; Gdk::Cursor* get_canvas_cursor () const; @@ -570,7 +570,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void cancel_visual_state_op (uint32_t n); framepos_t leftmost_frame; - framecnt_t samples_per_pixel; + framecnt_t samples_per_pixel; Editing::ZoomFocus zoom_focus; void set_samples_per_pixel (framecnt_t); @@ -837,11 +837,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD */ ArdourCanvas::Container* _drag_motion_group; - /* a rect that sits at the bottom of all tracks to act as a drag-no-drop/clickable + /* a rect that sits at the bottom of all tracks to act as a drag-no-drop/clickable * target area. */ - ArdourCanvas::Rectangle* _canvas_drop_zone; - bool canvas_drop_zone_event (GdkEvent* event); + ArdourCanvas::Rectangle* _canvas_drop_zone; + bool canvas_drop_zone_event (GdkEvent* event); enum RulerType { ruler_metric_timecode = 0, @@ -878,7 +878,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void update_just_timecode (); void compute_fixed_ruler_scale (); //calculates the RulerScale of the fixed rulers void update_fixed_rulers (); - void update_tempo_based_rulers (ARDOUR::TempoMap::BBTPointList::const_iterator& begin, + void update_tempo_based_rulers (ARDOUR::TempoMap::BBTPointList::const_iterator& begin, ARDOUR::TempoMap::BBTPointList::const_iterator& end); void popup_ruler_menu (framepos_t where = 0, ItemType type = RegionItem); void update_ruler_visibility (); @@ -942,7 +942,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD gint bbt_nmarks; uint32_t bbt_bar_helper_on; uint32_t bbt_accent_modulo; - void compute_bbt_ruler_scale (framepos_t lower, framepos_t upper, + void compute_bbt_ruler_scale (framepos_t lower, framepos_t upper, ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin, ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end); @@ -1041,9 +1041,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /** the adjustment that controls the overall editor vertical scroll position */ Gtk::Adjustment vertical_adjustment; - Gtk::Adjustment horizontal_adjustment; + Gtk::Adjustment horizontal_adjustment; - Gtk::Adjustment unused_adjustment; // yes, really; Gtk::Layout constructor requires refs + Gtk::Adjustment unused_adjustment; // yes, really; Gtk::Layout constructor requires refs Gtk::Layout controls_layout; bool control_layout_scroll (GdkEventScroll* ev); void reset_controls_layout_width (); @@ -1119,7 +1119,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD static int _idle_visual_changer (void *arg); int idle_visual_changer (); - void visual_changer (const VisualChange&); + void visual_changer (const VisualChange&); void ensure_visual_change_idle_handler (); /* track views */ @@ -1167,9 +1167,9 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void register_actions (); void register_region_actions (); - void load_bindings (); - Gtkmm2ext::ActionMap editor_action_map; - Gtkmm2ext::Bindings key_bindings; + void load_bindings (); + Gtkmm2ext::ActionMap editor_action_map; + Gtkmm2ext::Bindings key_bindings; /* CUT/COPY/PASTE */ @@ -1363,7 +1363,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD boost::shared_ptr get_nth_selected_audio_track (int nth) const; boost::shared_ptr get_nth_selected_midi_track (int nth) const; - void toggle_midi_input_active (bool flip_others); + void toggle_midi_input_active (bool flip_others); ARDOUR::InterThreadInfo* current_interthread_info; @@ -1606,21 +1606,17 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD ArdourCanvas::Container* time_line_group; void hide_measures (); - void draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin, + void draw_measures (ARDOUR::TempoMap::BBTPointList::const_iterator& begin, ARDOUR::TempoMap::BBTPointList::const_iterator& end); void new_tempo_section (); - void mouse_add_new_tempo_event (framepos_t where); - void mouse_add_new_meter_event (framepos_t where); void remove_tempo_marker (ArdourCanvas::Item*); void remove_meter_marker (ArdourCanvas::Item*); gint real_remove_tempo_marker (ARDOUR::TempoSection*); gint real_remove_meter_marker (ARDOUR::MeterSection*); - void edit_tempo_section (ARDOUR::TempoSection*); - void edit_meter_section (ARDOUR::MeterSection*); void edit_tempo_marker (TempoMarker&); void edit_meter_marker (MeterMarker&); void edit_control_point (ArdourCanvas::Item*); @@ -1672,7 +1668,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void remove_metric_marks (); void draw_metric_marks (const ARDOUR::Metrics& metrics); - void compute_current_bbt_points (framepos_t left, framepos_t right, + void compute_current_bbt_points (framepos_t left, framepos_t right, ARDOUR::TempoMap::BBTPointList::const_iterator& begin, ARDOUR::TempoMap::BBTPointList::const_iterator& end); @@ -1697,11 +1693,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD ArdourDropdown visible_tracks_selector; ArdourDropdown zoom_preset_selector; - int32_t _visible_track_count; - void build_track_count_menu (); - void set_visible_track_count (int32_t); - - void set_zoom_preset(int64_t); + int32_t _visible_track_count; + void build_track_count_menu (); + void set_visible_track_count (int32_t); + + void set_zoom_preset(int64_t); Gtk::VBox toolbar_clock_vbox; Gtk::VBox toolbar_selection_clock_vbox; @@ -1793,7 +1789,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD SelectionMemento* _selection_memento; void time_selection_changed (); - void update_time_selection_display (); + void update_time_selection_display (); void track_selection_changed (); void region_selection_changed (); sigc::connection editor_regions_selection_changed_connection; @@ -1866,15 +1862,15 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* autoscrolling */ - sigc::connection autoscroll_connection; - bool autoscroll_horizontal_allowed; - bool autoscroll_vertical_allowed; - uint32_t autoscroll_cnt; - Gtk::Widget* autoscroll_widget; - ArdourCanvas::Rect autoscroll_boundary; + sigc::connection autoscroll_connection; + bool autoscroll_horizontal_allowed; + bool autoscroll_vertical_allowed; + uint32_t autoscroll_cnt; + Gtk::Widget* autoscroll_widget; + ArdourCanvas::Rect autoscroll_boundary; bool autoscroll_canvas (); - void start_canvas_autoscroll (bool allow_horiz, bool allow_vert, const ArdourCanvas::Rect& boundary); + void start_canvas_autoscroll (bool allow_horiz, bool allow_vert, const ArdourCanvas::Rect& boundary); void stop_canvas_autoscroll (); /* trimming */ @@ -1897,45 +1893,45 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD /* Drag-n-Drop */ int convert_drop_to_paths ( - std::vector& paths, - const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); + std::vector& paths, + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); void track_canvas_drag_data_received ( - const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); void drop_paths ( - const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); void drop_regions ( - const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); void drop_routes ( - const Glib::RefPtr& context, - gint x, - gint y, - const Gtk::SelectionData& data, - guint info, - guint time); + const Glib::RefPtr& context, + gint x, + gint y, + const Gtk::SelectionData& data, + guint info, + guint time); /* audio export */ @@ -1976,12 +1972,12 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void duplicate_range (bool with_dialog); - /** computes the timeline frame (sample) of an event whose coordinates + /** computes the timeline frame (sample) of an event whose coordinates * are in canvas units (pixels, scroll offset included). */ framepos_t canvas_event_sample (GdkEvent const *, double* px = 0, double* py = 0) const; - /** computes the timeline frame (sample) of an event whose coordinates + /** computes the timeline frame (sample) of an event whose coordinates * are in window units (pixels, no scroll offset). */ framepos_t window_event_sample (GdkEvent const *, double* px = 0, double* py = 0) const; @@ -2201,7 +2197,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD bool _following_mixer_selection; int time_fx (ARDOUR::RegionList&, float val, bool pitching); - void note_edit_done (int, EditNoteDialog*); + void note_edit_done (int, EditNoteDialog*); void toggle_sound_midi_notes (); /** Flag for a bit of a hack wrt control point selection; see set_selected_control_point_from_click */ -- cgit v1.2.3 From 7de6128169f5e7834c6670b2d43e944aae2dd193 Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Tue, 3 Feb 2015 19:25:10 +0000 Subject: Add tempo and meter editing functions to main clock context menu Add 'Edit Tempo/Meter' and 'Insert Tempo/Meter Change' to the main clock's context menu. --- gtk2_ardour/editor.h | 5 +++++ gtk2_ardour/main_clock.cc | 37 +++++++++++++++++++++++++++++++++++++ gtk2_ardour/main_clock.h | 13 +++++++++++-- gtk2_ardour/public_editor.h | 5 +++++ 4 files changed, 58 insertions(+), 2 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index bd5f3816fb..fd308bed12 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -524,6 +524,11 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void split_region_at_points (boost::shared_ptr, ARDOUR::AnalysisFeatureList&, bool can_ferret, bool select_new = false); RegionSelection get_regions_from_selection_and_mouse (framepos_t); + void mouse_add_new_tempo_event (framepos_t where); + void mouse_add_new_meter_event (framepos_t where); + void edit_tempo_section (ARDOUR::TempoSection*); + void edit_meter_section (ARDOUR::MeterSection*); + protected: void map_transport_state (); void map_position_change (framepos_t); diff --git a/gtk2_ardour/main_clock.cc b/gtk2_ardour/main_clock.cc index 80dece04aa..b8bc733ea6 100644 --- a/gtk2_ardour/main_clock.cc +++ b/gtk2_ardour/main_clock.cc @@ -19,9 +19,12 @@ #include "ardour_ui.h" #include "main_clock.h" +#include "public_editor.h" #include "i18n.h" +#include "ardour/tempo.h" + using namespace Gtk; MainClock::MainClock ( @@ -62,6 +65,12 @@ MainClock::build_ops_menu () c->set_active (true); } } + + ops_items.push_back (SeparatorElem()); + ops_items.push_back (MenuElem (_("Edit Tempo"), sigc::mem_fun(*this, &MainClock::edit_current_tempo))); + ops_items.push_back (MenuElem (_("Edit Meter"), sigc::mem_fun(*this, &MainClock::edit_current_meter))); + ops_items.push_back (MenuElem (_("Insert Tempo Change"), sigc::mem_fun(*this, &MainClock::insert_new_tempo))); + ops_items.push_back (MenuElem (_("Insert Meter Change"), sigc::mem_fun(*this, &MainClock::insert_new_meter))); } void @@ -73,3 +82,31 @@ MainClock::display_delta_to_edit_cursor () ARDOUR_UI::config()->set_secondary_clock_delta_edit_cursor (!ARDOUR_UI::config()->get_secondary_clock_delta_edit_cursor ()); } } + +void +MainClock::edit_current_tempo () +{ + ARDOUR::TempoSection ts = PublicEditor::instance().session()->tempo_map().tempo_section_at(current_time()); + PublicEditor::instance().edit_tempo_section (&ts); +} + +void +MainClock::edit_current_meter () +{ + ARDOUR::Meter m = PublicEditor::instance().session()->tempo_map().meter_at(current_time()); + ARDOUR::MeterSection ms(current_time(), m.divisions_per_bar(), m.note_divisor()); + PublicEditor::instance().edit_meter_section (&ms); +} + +void +MainClock::insert_new_tempo () +{ + PublicEditor::instance().mouse_add_new_tempo_event (current_time ()); +} + +void +MainClock::insert_new_meter () +{ + PublicEditor::instance().mouse_add_new_meter_event (current_time ()); +} + diff --git a/gtk2_ardour/main_clock.h b/gtk2_ardour/main_clock.h index 959a3f9440..f5f9096b39 100644 --- a/gtk2_ardour/main_clock.h +++ b/gtk2_ardour/main_clock.h @@ -19,15 +19,24 @@ #include "audio_clock.h" -/** A simple subclass of AudioClock that adds the `display delta to edit cursor' option to its context menu */ +/** A simple subclass of AudioClock that adds a few things to its context menu: + * `display delta to edit cursor' and edit/change tempo/meter + */ class MainClock : public AudioClock { public: - MainClock (const std::string &, bool, const std::string &, bool, bool, bool primary, bool duration = false, bool with_info = false); + MainClock (const std::string& clock_name, bool is_transient, const std::string& widget_name, + bool editable, bool follows_playhead, bool primary, bool duration = false, bool with_info = false); private: + // Editor *_editor; + void build_ops_menu (); void display_delta_to_edit_cursor (); + void edit_current_tempo (); + void edit_current_meter (); + void insert_new_tempo (); + void insert_new_meter (); bool _primary; }; diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index e580ac0ec3..3b18cd41e1 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -419,6 +419,11 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi virtual void get_regionviews_by_id (PBD::ID const id, RegionSelection & regions) const = 0; virtual void get_per_region_note_selection (std::list > > > >&) const = 0; + virtual void mouse_add_new_tempo_event (framepos_t where) = 0; + virtual void mouse_add_new_meter_event (framepos_t where) = 0; + virtual void edit_tempo_section (ARDOUR::TempoSection*) = 0; + virtual void edit_meter_section (ARDOUR::MeterSection*) = 0; + /// Singleton instance, set up by Editor::Editor() static PublicEditor* _instance; -- cgit v1.2.3 From 1973243a988be0717948f0fb2075bce4fe11e27b Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Fri, 6 Feb 2015 23:56:34 +0000 Subject: Separate out creation of xrun markers from Editor::mouse_add_new_marker() Remove the is_xrun parameter from Editor::mouse_add_new_marker(), and just create the marker directly in ARDOUR_UI::create_xrun_marker(), so that xrun markers don't become automatically selected when they appear. --- gtk2_ardour/ardour_ui.cc | 5 ++++- gtk2_ardour/editor.h | 2 +- gtk2_ardour/editor_markers.cc | 15 ++++----------- gtk2_ardour/editor_rulers.cc | 4 ++-- gtk2_ardour/public_editor.h | 2 +- 5 files changed, 12 insertions(+), 16 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index c9ef1387af..ee27e8c6f3 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -3894,7 +3894,10 @@ ARDOUR_UI::keyboard_settings () const void ARDOUR_UI::create_xrun_marker (framepos_t where) { - editor->mouse_add_new_marker (where, false, true); + if (_session) { + Location *location = new Location (*_session, where, where, _("xrun"), Location::IsMark); + _session->locations()->add (location); + } } void diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index fd308bed12..fd090edee1 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -519,7 +519,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void metric_get_minsec (std::vector&, gdouble, gdouble, gint); /* editing operations that need to be public */ - void mouse_add_new_marker (framepos_t where, bool is_cd=false, bool is_xrun=false); + void mouse_add_new_marker (framepos_t where, bool is_cd=false); void split_regions_at (framepos_t, RegionSelection&); void split_region_at_points (boost::shared_ptr, ARDOUR::AnalysisFeatureList&, bool can_ferret, bool select_new = false); RegionSelection get_regions_from_selection_and_mouse (framepos_t); diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc index d982de3a32..17315d702f 100644 --- a/gtk2_ardour/editor_markers.cc +++ b/gtk2_ardour/editor_markers.cc @@ -636,21 +636,14 @@ Editor::LocationMarkers::setup_lines () } void -Editor::mouse_add_new_marker (framepos_t where, bool is_cd, bool is_xrun) +Editor::mouse_add_new_marker (framepos_t where, bool is_cd) { - string markername, markerprefix; + string markername; int flags = (is_cd ? Location::IsCDMarker|Location::IsMark : Location::IsMark); - if (is_xrun) { - markerprefix = "xrun"; - flags = Location::IsMark; - } else { - markerprefix = "mark"; - } - if (_session) { - _session->locations()->next_available_name(markername, markerprefix); - if (!is_xrun && !choose_new_marker_name(markername)) { + _session->locations()->next_available_name(markername, _("mark")); + if (!choose_new_marker_name(markername)) { return; } Location *location = new Location (*_session, where, where, markername, (Location::Flags) flags); diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc index 9ef589facb..4bbacb024d 100644 --- a/gtk2_ardour/editor_rulers.cc +++ b/gtk2_ardour/editor_rulers.cc @@ -208,7 +208,7 @@ Editor::popup_ruler_menu (framepos_t where, ItemType t) switch (t) { case MarkerBarItem: - ruler_items.push_back (MenuElem (_("New location marker"), sigc::bind ( sigc::mem_fun(*this, &Editor::mouse_add_new_marker), where, false, false))); + ruler_items.push_back (MenuElem (_("New location marker"), sigc::bind ( sigc::mem_fun(*this, &Editor::mouse_add_new_marker), where, false))); ruler_items.push_back (MenuElem (_("Clear all locations"), sigc::mem_fun(*this, &Editor::clear_markers))); ruler_items.push_back (MenuElem (_("Unhide locations"), sigc::mem_fun(*this, &Editor::unhide_markers))); ruler_items.push_back (SeparatorElem ()); @@ -226,7 +226,7 @@ Editor::popup_ruler_menu (framepos_t where, ItemType t) case CdMarkerBarItem: // TODO - ruler_items.push_back (MenuElem (_("New CD track marker"), sigc::bind ( sigc::mem_fun(*this, &Editor::mouse_add_new_marker), where, true, false))); + ruler_items.push_back (MenuElem (_("New CD track marker"), sigc::bind ( sigc::mem_fun(*this, &Editor::mouse_add_new_marker), where, true))); break; diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index 3b18cd41e1..5e7a0f6095 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -285,7 +285,7 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi virtual void toggle_meter_updating() = 0; virtual void split_regions_at (framepos_t, RegionSelection&) = 0; virtual void split_region_at_points (boost::shared_ptr, ARDOUR::AnalysisFeatureList&, bool can_ferret, bool select_new = false) = 0; - virtual void mouse_add_new_marker (framepos_t where, bool is_cd=false, bool is_xrun=false) = 0; + virtual void mouse_add_new_marker (framepos_t where, bool is_cd=false) = 0; virtual void foreach_time_axis_view (sigc::slot) = 0; virtual void add_to_idle_resize (TimeAxisView*, int32_t) = 0; virtual framecnt_t get_nudge_distance (framepos_t pos, framecnt_t& next) = 0; -- cgit v1.2.3 From 24e8e865a6c5240ddacb2e2dca2f45be29ebfb03 Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Sat, 7 Feb 2015 01:13:04 +0000 Subject: Ignore playhead when finding delta from edit position for main clocks Pass 'ignore_playhead == true' to Editor::get_preferred_edit_position() when calculating offset of the primary and secondary main clocks if 'delta to edit cursor' is selected, so that if the edit point is playhead, the selected marker (if any) or mouse position will be used as the delta origin instead. --- gtk2_ardour/ardour_ui.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index ee27e8c6f3..3767689cfd 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -2269,7 +2269,7 @@ ARDOUR_UI::update_clocks () if (!_session) return; if (editor && !editor->dragging_playhead()) { - Clock (_session->audible_frame(), false, editor->get_preferred_edit_position()); /* EMIT_SIGNAL */ + Clock (_session->audible_frame(), false, editor->get_preferred_edit_position (true)); /* EMIT_SIGNAL */ } } @@ -4218,13 +4218,13 @@ void ARDOUR_UI::update_transport_clocks (framepos_t pos) { if (ui_config->get_primary_clock_delta_edit_cursor()) { - primary_clock->set (pos, false, editor->get_preferred_edit_position()); + primary_clock->set (pos, false, editor->get_preferred_edit_position (true)); } else { primary_clock->set (pos); } if (ui_config->get_secondary_clock_delta_edit_cursor()) { - secondary_clock->set (pos, false, editor->get_preferred_edit_position()); + secondary_clock->set (pos, false, editor->get_preferred_edit_position (true)); } else { secondary_clock->set (pos); } -- cgit v1.2.3 From ecd265222a6fe7a1d2dba1aa706a1ea95abeff87 Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Sat, 7 Feb 2015 23:22:59 +0000 Subject: Add/edit tempo/meter change at right position with 'delta to edit cursor' Find the absolute position of the main clock when 'display delta to edit cursor' is set when adding/editing tempo/meter changes from the context menu. --- gtk2_ardour/audio_clock.h | 1 + gtk2_ardour/main_clock.cc | 21 ++++++++++++++++----- gtk2_ardour/main_clock.h | 1 + 3 files changed, 18 insertions(+), 5 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/audio_clock.h b/gtk2_ardour/audio_clock.h index 83bc3233c2..f00b6db8ec 100644 --- a/gtk2_ardour/audio_clock.h +++ b/gtk2_ardour/audio_clock.h @@ -96,6 +96,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr protected: void render (cairo_t*, cairo_rectangle_t*); + bool get_is_duration () const { return is_duration; } ; virtual void build_ops_menu (); Gtk::Menu *ops_menu; diff --git a/gtk2_ardour/main_clock.cc b/gtk2_ardour/main_clock.cc index b8bc733ea6..8bb685da4b 100644 --- a/gtk2_ardour/main_clock.cc +++ b/gtk2_ardour/main_clock.cc @@ -73,6 +73,17 @@ MainClock::build_ops_menu () ops_items.push_back (MenuElem (_("Insert Meter Change"), sigc::mem_fun(*this, &MainClock::insert_new_meter))); } +framepos_t +MainClock::absolute_time () const +{ + if (get_is_duration ()) { + // delta to edit cursor + return current_time () + PublicEditor::instance().get_preferred_edit_position (true); + } else { + return current_time (); + } +} + void MainClock::display_delta_to_edit_cursor () { @@ -86,27 +97,27 @@ MainClock::display_delta_to_edit_cursor () void MainClock::edit_current_tempo () { - ARDOUR::TempoSection ts = PublicEditor::instance().session()->tempo_map().tempo_section_at(current_time()); + ARDOUR::TempoSection ts = PublicEditor::instance().session()->tempo_map().tempo_section_at (absolute_time()); PublicEditor::instance().edit_tempo_section (&ts); } void MainClock::edit_current_meter () { - ARDOUR::Meter m = PublicEditor::instance().session()->tempo_map().meter_at(current_time()); - ARDOUR::MeterSection ms(current_time(), m.divisions_per_bar(), m.note_divisor()); + ARDOUR::Meter m = PublicEditor::instance().session()->tempo_map().meter_at (absolute_time()); + ARDOUR::MeterSection ms (absolute_time(), m.divisions_per_bar(), m.note_divisor()); PublicEditor::instance().edit_meter_section (&ms); } void MainClock::insert_new_tempo () { - PublicEditor::instance().mouse_add_new_tempo_event (current_time ()); + PublicEditor::instance().mouse_add_new_tempo_event (absolute_time ()); } void MainClock::insert_new_meter () { - PublicEditor::instance().mouse_add_new_meter_event (current_time ()); + PublicEditor::instance().mouse_add_new_meter_event (absolute_time ()); } diff --git a/gtk2_ardour/main_clock.h b/gtk2_ardour/main_clock.h index f5f9096b39..fc9075432f 100644 --- a/gtk2_ardour/main_clock.h +++ b/gtk2_ardour/main_clock.h @@ -38,5 +38,6 @@ private: void edit_current_meter (); void insert_new_tempo (); void insert_new_meter (); + framepos_t absolute_time () const; bool _primary; }; -- cgit v1.2.3 From 760e00b028f35937abc72695a02838372eb275a7 Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Sun, 15 Feb 2015 12:56:25 +0000 Subject: Remove useless parameters from MainClock constructor Remove (always false) duration & is_transient and (always true) editable, with_info & follows_playhead parameters from MainClock constructor, and just pass the requisite true & false values along to the AudioClock constructor instead. --- gtk2_ardour/ardour_ui.cc | 4 ++-- gtk2_ardour/main_clock.cc | 9 ++------- gtk2_ardour/main_clock.h | 3 +-- 3 files changed, 5 insertions(+), 11 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 3767689cfd..c7a6724f94 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -161,8 +161,8 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) , ui_config (new UIConfiguration) , gui_object_state (new GUIObjectState) - , primary_clock (new MainClock (X_("primary"), false, X_("transport"), true, true, true, false, true)) - , secondary_clock (new MainClock (X_("secondary"), false, X_("secondary"), true, true, false, false, true)) + , primary_clock (new MainClock (X_("primary"), X_("transport"), true )) + , secondary_clock (new MainClock (X_("secondary"), X_("secondary"), false)) /* big clock */ diff --git a/gtk2_ardour/main_clock.cc b/gtk2_ardour/main_clock.cc index 8bb685da4b..bbb3d5af4e 100644 --- a/gtk2_ardour/main_clock.cc +++ b/gtk2_ardour/main_clock.cc @@ -29,15 +29,10 @@ using namespace Gtk; MainClock::MainClock ( const std::string& clock_name, - bool is_transient, const std::string& widget_name, - bool editable, - bool follows_playhead, - bool primary, - bool duration, - bool with_info + bool primary ) - : AudioClock (clock_name, is_transient, widget_name, editable, follows_playhead, duration, with_info) + : AudioClock (clock_name, false, widget_name, true, true, false, true) , _primary (primary) { diff --git a/gtk2_ardour/main_clock.h b/gtk2_ardour/main_clock.h index fc9075432f..767216be08 100644 --- a/gtk2_ardour/main_clock.h +++ b/gtk2_ardour/main_clock.h @@ -25,8 +25,7 @@ class MainClock : public AudioClock { public: - MainClock (const std::string& clock_name, bool is_transient, const std::string& widget_name, - bool editable, bool follows_playhead, bool primary, bool duration = false, bool with_info = false); + MainClock (const std::string& clock_name, const std::string& widget_name, bool primary); private: -- cgit v1.2.3 From 99e15d94025b7ce9046b3e8d4c4e7b2e1635df7a Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Sun, 15 Feb 2015 18:26:15 +0000 Subject: Make left-click on tempo/meter in main clock edit current tempo/meter --- gtk2_ardour/audio_clock.cc | 2 +- gtk2_ardour/audio_clock.h | 13 +++++++++++-- gtk2_ardour/main_clock.cc | 21 +++++++++++++++++++++ gtk2_ardour/main_clock.h | 2 ++ 4 files changed, 35 insertions(+), 3 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index ae170b8548..7ad1a89dc0 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -333,7 +333,7 @@ AudioClock::render (cairo_t* cr, cairo_rectangle_t*) if (mode_based_info_ratio != 1.0) { - double left_rect_width = round (((get_width() - separator_height) * mode_based_info_ratio) + 0.5); + double left_rect_width = get_left_rect_width(); if (_need_bg) { if (corner_radius) { diff --git a/gtk2_ardour/audio_clock.h b/gtk2_ardour/audio_clock.h index f00b6db8ec..4602ce8efc 100644 --- a/gtk2_ardour/audio_clock.h +++ b/gtk2_ardour/audio_clock.h @@ -101,6 +101,17 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr virtual void build_ops_menu (); Gtk::Menu *ops_menu; + bool on_button_press_event (GdkEventButton *ev); + bool on_button_release_event(GdkEventButton *ev); + bool is_lower_layout_click(int y) const { + return y > upper_height + separator_height; + } + bool is_right_layout_click(int x) const { + return x > x_leading_padding + get_left_rect_width() + separator_height; + } + double get_left_rect_width() const { + return round (((get_width() - separator_height) * mode_based_info_ratio) + 0.5); + } private: Mode _mode; std::string _name; @@ -186,8 +197,6 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr bool on_key_press_event (GdkEventKey *); bool on_key_release_event (GdkEventKey *); bool on_scroll_event (GdkEventScroll *ev); - bool on_button_press_event (GdkEventButton *ev); - bool on_button_release_event(GdkEventButton *ev); void on_style_changed (const Glib::RefPtr&); void on_size_request (Gtk::Requisition* req); bool on_motion_notify_event (GdkEventMotion *ev); diff --git a/gtk2_ardour/main_clock.cc b/gtk2_ardour/main_clock.cc index bbb3d5af4e..f90599de13 100644 --- a/gtk2_ardour/main_clock.cc +++ b/gtk2_ardour/main_clock.cc @@ -116,3 +116,24 @@ MainClock::insert_new_meter () PublicEditor::instance().mouse_add_new_meter_event (absolute_time ()); } +bool +MainClock::on_button_press_event (GdkEventButton *ev) +{ + if (ev->button == 1) { + if (mode() == BBT) { + if (is_lower_layout_click(ev->y)) { + if (is_right_layout_click(ev->x)) { + // meter on the right + edit_current_meter(); + } else { + // tempo on the left + edit_current_tempo(); + } + return true; + } + } + } + + return AudioClock::on_button_press_event (ev); +} + diff --git a/gtk2_ardour/main_clock.h b/gtk2_ardour/main_clock.h index 767216be08..696b7e21e6 100644 --- a/gtk2_ardour/main_clock.h +++ b/gtk2_ardour/main_clock.h @@ -39,4 +39,6 @@ private: void insert_new_meter (); framepos_t absolute_time () const; bool _primary; + + bool on_button_press_event (GdkEventButton *ev); }; -- cgit v1.2.3 From f7a2df1c9a8c540f7e5778561c8527c525874b84 Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Sun, 8 Mar 2015 15:48:27 +0000 Subject: Make editing of meter work at the current position Add a function TempoMap::meter_section_at(), similar to TempoMap::tempo_section_at() but returning the meter section at the given position, and use this to make editing meter changes from the main clock work on the meter that's in effect at the current position. --- gtk2_ardour/main_clock.cc | 3 +-- libs/ardour/ardour/tempo.h | 1 + libs/ardour/tempo.cc | 27 +++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/main_clock.cc b/gtk2_ardour/main_clock.cc index f90599de13..26d780ea8a 100644 --- a/gtk2_ardour/main_clock.cc +++ b/gtk2_ardour/main_clock.cc @@ -99,8 +99,7 @@ MainClock::edit_current_tempo () void MainClock::edit_current_meter () { - ARDOUR::Meter m = PublicEditor::instance().session()->tempo_map().meter_at (absolute_time()); - ARDOUR::MeterSection ms (absolute_time(), m.divisions_per_bar(), m.note_divisor()); + ARDOUR::MeterSection ms = PublicEditor::instance().session()->tempo_map().meter_section_at (absolute_time()); PublicEditor::instance().edit_meter_section (&ms); } diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h index f2d314651d..29f1f25643 100644 --- a/libs/ardour/ardour/tempo.h +++ b/libs/ardour/ardour/tempo.h @@ -287,6 +287,7 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible const Meter& meter_at (framepos_t) const; const TempoSection& tempo_section_at (framepos_t) const; + const MeterSection& meter_section_at (framepos_t) const; void add_tempo (const Tempo&, Timecode::BBT_Time where); void add_meter (const Meter&, Timecode::BBT_Time where); diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index ff6553e820..8c4011cefd 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -1583,6 +1583,33 @@ TempoMap::tempo_at (framepos_t frame) const return m.tempo(); } +const MeterSection& +TempoMap::meter_section_at (framepos_t frame) const +{ + Glib::Threads::RWLock::ReaderLock lm (lock); + Metrics::const_iterator i; + MeterSection* prev = 0; + + for (i = metrics.begin(); i != metrics.end(); ++i) { + MeterSection* t; + + if ((t = dynamic_cast (*i)) != 0) { + + if ((*i)->frame() > frame) { + break; + } + + prev = t; + } + } + + if (prev == 0) { + fatal << endmsg; + abort(); /*NOTREACHED*/ + } + + return *prev; +} const Meter& TempoMap::meter_at (framepos_t frame) const -- cgit v1.2.3 From 37b0e8ac90aae8d5359f67a7a32bfe78ad6422af Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Mon, 9 Mar 2015 19:19:16 +0000 Subject: Use ev->time rather than g_get_monotonic_time() for tap tempo Connect signal_button_press_event of 'Tap Tempo' button rather than signal_clicked so we can use the time member of GdkEventButton to calculate the tapped tempo. It seems to me that this is the right thing to do. --- gtk2_ardour/tempo_dialog.cc | 12 +++++++----- gtk2_ardour/tempo_dialog.h | 4 ++-- 2 files changed, 9 insertions(+), 7 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/tempo_dialog.cc b/gtk2_ardour/tempo_dialog.cc index 18b5e144cb..e11644131b 100644 --- a/gtk2_ardour/tempo_dialog.cc +++ b/gtk2_ardour/tempo_dialog.cc @@ -178,7 +178,7 @@ TempoDialog::init (const Timecode::BBT_Time& when, double bpm, double note_type, when_beat_entry.signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &TempoDialog::response), RESPONSE_ACCEPT)); when_beat_entry.signal_key_release_event().connect (sigc::mem_fun (*this, &TempoDialog::entry_key_release), false); pulse_selector.signal_changed().connect (sigc::mem_fun (*this, &TempoDialog::pulse_change)); - tap_tempo_button.signal_clicked().connect (sigc::mem_fun (*this, &TempoDialog::tap_tempo)); + tap_tempo_button.signal_button_press_event().connect (sigc::mem_fun (*this, &TempoDialog::tap_tempo_button_press), false); } bool @@ -258,17 +258,18 @@ TempoDialog::pulse_change () set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid()); } -void -TempoDialog::tap_tempo () + +bool +TempoDialog::tap_tempo_button_press (GdkEventButton *ev) { gint64 now; - now = g_get_monotonic_time (); // microseconds + now = ev->time; // milliseconds if (last_tap > 0) { double interval, bpm; static const double decay = 0.5; - interval = (now - last_tap) * 1.0e-6; + interval = (now - last_tap) * 1.0e-3; if (interval <= 6.0) { // >= 10 bpm, say if (average_interval > 0) { @@ -287,6 +288,7 @@ TempoDialog::tap_tempo () average_interval = 0; } last_tap = now; + return false; } MeterDialog::MeterDialog (TempoMap& map, framepos_t frame, const string&) diff --git a/gtk2_ardour/tempo_dialog.h b/gtk2_ardour/tempo_dialog.h index da924ac859..67e6e6ec76 100644 --- a/gtk2_ardour/tempo_dialog.h +++ b/gtk2_ardour/tempo_dialog.h @@ -53,12 +53,12 @@ private: bool bpm_button_release (GdkEventButton* ); bool entry_key_release (GdkEventKey* ); void pulse_change (); - void tap_tempo (); + bool tap_tempo_button_press (GdkEventButton* ); typedef std::map NoteTypes; NoteTypes note_types; - gint64 last_tap; + guint32 last_tap; double average_interval; Gtk::ComboBoxText pulse_selector; -- cgit v1.2.3 From ee959e73fd02c5eefc56a27d23e9ce847b0fab55 Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Thu, 19 Mar 2015 19:44:20 +0000 Subject: tap-tempo: try to make it work properly from the very first click --- gtk2_ardour/tempo_dialog.cc | 19 +++++++++++++++---- gtk2_ardour/tempo_dialog.h | 6 ++++-- 2 files changed, 19 insertions(+), 6 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/tempo_dialog.cc b/gtk2_ardour/tempo_dialog.cc index e11644131b..2a353d4b7d 100644 --- a/gtk2_ardour/tempo_dialog.cc +++ b/gtk2_ardour/tempo_dialog.cc @@ -179,6 +179,9 @@ TempoDialog::init (const Timecode::BBT_Time& when, double bpm, double note_type, when_beat_entry.signal_key_release_event().connect (sigc::mem_fun (*this, &TempoDialog::entry_key_release), false); pulse_selector.signal_changed().connect (sigc::mem_fun (*this, &TempoDialog::pulse_change)); tap_tempo_button.signal_button_press_event().connect (sigc::mem_fun (*this, &TempoDialog::tap_tempo_button_press), false); + tap_tempo_button.signal_focus_out_event().connect (sigc::mem_fun (*this, &TempoDialog::tap_tempo_focus_out)); + + tapped = false; } bool @@ -262,17 +265,17 @@ TempoDialog::pulse_change () bool TempoDialog::tap_tempo_button_press (GdkEventButton *ev) { - gint64 now; + guint32 now; now = ev->time; // milliseconds - if (last_tap > 0) { + if (tapped) { double interval, bpm; static const double decay = 0.5; interval = (now - last_tap) * 1.0e-3; if (interval <= 6.0) { - // >= 10 bpm, say - if (average_interval > 0) { + // <= 6 seconds (say): >= 10 bpm + if (average_interval > 0 && average_interval > interval / 1.2 && average_interval < interval * 1.2) { average_interval = interval * decay + average_interval * (1.0-decay); } else { @@ -286,11 +289,19 @@ TempoDialog::tap_tempo_button_press (GdkEventButton *ev) } } else { average_interval = 0; + tapped = true; } last_tap = now; return false; } +bool +TempoDialog::tap_tempo_focus_out (GdkEventFocus* ) +{ + tapped = false; + return false; +} + MeterDialog::MeterDialog (TempoMap& map, framepos_t frame, const string&) : ArdourDialog (_("New Meter")) { diff --git a/gtk2_ardour/tempo_dialog.h b/gtk2_ardour/tempo_dialog.h index 67e6e6ec76..97d89e2867 100644 --- a/gtk2_ardour/tempo_dialog.h +++ b/gtk2_ardour/tempo_dialog.h @@ -54,12 +54,14 @@ private: bool entry_key_release (GdkEventKey* ); void pulse_change (); bool tap_tempo_button_press (GdkEventButton* ); + bool tap_tempo_focus_out (GdkEventFocus* ); typedef std::map NoteTypes; NoteTypes note_types; - guint32 last_tap; - double average_interval; + bool tapped; // whether the tap-tempo button has been clicked + guint32 last_tap; // time of the last tap (in mS, from GdkEventButton::time). Only valid if tapped is true + double average_interval; // running average of tap tempo button press interval times Gtk::ComboBoxText pulse_selector; Gtk::Adjustment bpm_adjustment; -- cgit v1.2.3 From 3127587f9a9acb5bc19efea9a0aab8ad3214640b Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Thu, 19 Mar 2015 20:14:06 +0000 Subject: Go back to using g_get_monotonic_time() for tap tempo Using ev->time doesn't work as well as I'd hoped, so revert to the previous method with g_get_monotonic_time(). --- gtk2_ardour/tempo_dialog.cc | 8 +++----- gtk2_ardour/tempo_dialog.h | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/tempo_dialog.cc b/gtk2_ardour/tempo_dialog.cc index 2a353d4b7d..02686b62ff 100644 --- a/gtk2_ardour/tempo_dialog.cc +++ b/gtk2_ardour/tempo_dialog.cc @@ -261,18 +261,17 @@ TempoDialog::pulse_change () set_response_sensitive (RESPONSE_ACCEPT, is_user_input_valid()); } - bool TempoDialog::tap_tempo_button_press (GdkEventButton *ev) { - guint32 now; - now = ev->time; // milliseconds + gint64 now; + now = g_get_monotonic_time (); // microseconds if (tapped) { double interval, bpm; static const double decay = 0.5; - interval = (now - last_tap) * 1.0e-3; + interval = (now - last_tap) * 1.0e-6; if (interval <= 6.0) { // <= 6 seconds (say): >= 10 bpm if (average_interval > 0 && average_interval > interval / 1.2 && average_interval < interval * 1.2) { @@ -292,7 +291,6 @@ TempoDialog::tap_tempo_button_press (GdkEventButton *ev) tapped = true; } last_tap = now; - return false; } bool diff --git a/gtk2_ardour/tempo_dialog.h b/gtk2_ardour/tempo_dialog.h index 97d89e2867..eda4e61f1a 100644 --- a/gtk2_ardour/tempo_dialog.h +++ b/gtk2_ardour/tempo_dialog.h @@ -60,8 +60,8 @@ private: NoteTypes note_types; bool tapped; // whether the tap-tempo button has been clicked - guint32 last_tap; // time of the last tap (in mS, from GdkEventButton::time). Only valid if tapped is true - double average_interval; // running average of tap tempo button press interval times + gint64 last_tap; + double average_interval; Gtk::ComboBoxText pulse_selector; Gtk::Adjustment bpm_adjustment; -- cgit v1.2.3 From d3d7428a189d031739f901472f016b2907752640 Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Sat, 21 Mar 2015 12:12:11 +0000 Subject: tap-tempo: reset running average whenever tapped tempo deviates by +/- 20% --- gtk2_ardour/tempo_dialog.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/tempo_dialog.cc b/gtk2_ardour/tempo_dialog.cc index 02686b62ff..8ccafecab2 100644 --- a/gtk2_ardour/tempo_dialog.cc +++ b/gtk2_ardour/tempo_dialog.cc @@ -274,15 +274,21 @@ TempoDialog::tap_tempo_button_press (GdkEventButton *ev) interval = (now - last_tap) * 1.0e-6; if (interval <= 6.0) { // <= 6 seconds (say): >= 10 bpm - if (average_interval > 0 && average_interval > interval / 1.2 && average_interval < interval * 1.2) { + if (average_interval > 0) { + if (average_interval > interval / 1.2 && average_interval < interval * 1.2) { average_interval = interval * decay + average_interval * (1.0-decay); + } else { + average_interval = 0; + } } else { average_interval = interval; } - bpm = 60.0 / average_interval; - bpm_spinner.set_value (bpm); + if (average_interval > 0) { + bpm = 60.0 / average_interval; + bpm_spinner.set_value (bpm); + } } else { average_interval = 0; } -- cgit v1.2.3