From 18249f739523cbea5b1d2a154a012f8d7653c8e4 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sun, 26 Feb 2023 12:26:11 -0700 Subject: [PATCH] ardour has a new ruler The mapping bar is where tempo mapping operations will take place --- gtk2_ardour/ardour.menus.in | 1 + gtk2_ardour/editor.cc | 8 ++++ gtk2_ardour/editor.h | 4 ++ gtk2_ardour/editor_actions.cc | 2 + gtk2_ardour/editor_canvas.cc | 17 ++++++++ gtk2_ardour/editor_items.h | 1 + gtk2_ardour/editor_mouse.cc | 7 ++++ gtk2_ardour/editor_rulers.cc | 42 +++++++++++++++---- gtk2_ardour/enums.cc | 1 + gtk2_ardour/ruler_dialog.cc | 2 + gtk2_ardour/ruler_dialog.h | 1 + .../themes/blueberry_milk-ardour.colors | 1 + gtk2_ardour/themes/caineville-ardour.colors | 1 + gtk2_ardour/themes/clear_gray-ardour.colors | 1 + gtk2_ardour/themes/cubasish-ardour.colors | 1 + gtk2_ardour/themes/dark-ardour.colors | 1 + gtk2_ardour/themes/diehard3-ardour.colors | 1 + gtk2_ardour/themes/recbox-ardour.colors | 1 + gtk2_ardour/themes/unastudia-ardour.colors | 1 + gtk2_ardour/themes/xcolors-ardour.colors | 1 + 20 files changed, 87 insertions(+), 8 deletions(-) diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index 04a2202d76..57722bf249 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -526,6 +526,7 @@ + diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 7c8b866ed2..6f9774af68 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -332,6 +332,7 @@ Editor::Editor () , timecode_label (_("Timecode")) , samples_label (_("Samples")) , tempo_label (_("Tempo")) + , mapping_label (_("Tempo Mapping")) , meter_label (_("Time Signature")) , mark_label (_("Location Markers")) , range_mark_label (_("Range Markers")) @@ -543,6 +544,13 @@ Editor::Editor () tempo_label.hide(); tempo_label.set_no_show_all(); + mapping_label.set_name ("EditorRulerLabel"); + mapping_label.set_size_request (-1, (int)timebar_height); + mapping_label.set_alignment (1.0, 0.5); + mapping_label.set_padding (5,0); + mapping_label.hide(); + mapping_label.set_no_show_all(); + meter_label.set_name ("EditorRulerLabel"); meter_label.set_size_request (-1, (int)timebar_height); meter_label.set_alignment (1.0, 0.5); diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 88480a587b..2481ffc188 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -915,6 +915,7 @@ private: Gtk::VBox time_bars_vbox; ArdourCanvas::Container* tempo_group; + ArdourCanvas::Container* mapping_group; ArdourCanvas::Container* meter_group; ArdourCanvas::Container* marker_group; ArdourCanvas::Container* range_marker_group; @@ -961,6 +962,7 @@ private: Glib::RefPtr ruler_bbt_action; Glib::RefPtr ruler_meter_action; Glib::RefPtr ruler_tempo_action; + Glib::RefPtr ruler_mapping_action; Glib::RefPtr ruler_range_action; Glib::RefPtr ruler_loop_punch_action; Glib::RefPtr ruler_cd_marker_action; @@ -1049,6 +1051,7 @@ private: Gtk::Menu* editor_ruler_menu; ArdourCanvas::Rectangle* tempo_bar; + ArdourCanvas::Rectangle* mapping_bar; ArdourCanvas::Rectangle* meter_bar; ArdourCanvas::Rectangle* marker_bar; ArdourCanvas::Rectangle* range_marker_bar; @@ -1064,6 +1067,7 @@ private: Gtk::Label timecode_label; Gtk::Label samples_label; Gtk::Label tempo_label; + Gtk::Label mapping_label; Gtk::Label meter_label; Gtk::Label mark_label; Gtk::Label range_mark_label; diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index b8a1cd020f..7ece9c52d9 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -177,6 +177,7 @@ Editor::register_actions () ActionManager::register_action (editor_menu_actions, X_("Subframes"), _("Subframes")); ActionManager::register_action (editor_menu_actions, X_("SyncMenu"), _("Sync")); ActionManager::register_action (editor_menu_actions, X_("TempoMenu"), _("Tempo")); + ActionManager::register_action (editor_menu_actions, X_("MappingMenu"), _("Mapping")); ActionManager::register_action (editor_menu_actions, X_("Timecode"), _("Timecode fps")); ActionManager::register_action (editor_menu_actions, X_("LayerDisplay"), _("Region Layers")); @@ -709,6 +710,7 @@ Editor::register_actions () ruler_bbt_action = Glib::RefPtr::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-bbt-ruler"), _("Bars:Beats"), sigc::mem_fun(*this, &Editor::toggle_ruler_visibility))); ruler_meter_action = Glib::RefPtr::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-meter-ruler"), _("Time Signature"), sigc::mem_fun(*this, &Editor::toggle_ruler_visibility))); ruler_tempo_action = Glib::RefPtr::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-tempo-ruler"), _("Tempo"), sigc::mem_fun(*this, &Editor::toggle_ruler_visibility))); + ruler_mapping_action = Glib::RefPtr::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-mapping-ruler"), _("Tempo Mapping"), sigc::mem_fun(*this, &Editor::toggle_ruler_visibility))); ruler_range_action = Glib::RefPtr::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-range-ruler"), _("Range Markers"), sigc::mem_fun(*this, &Editor::toggle_ruler_visibility))); ruler_loop_punch_action = Glib::RefPtr::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-loop-punch-ruler"), _("Loop/Punch Ranges"), sigc::mem_fun(*this, &Editor::toggle_ruler_visibility))); ruler_cd_marker_action = Glib::RefPtr::cast_static (ActionManager::register_toggle_action (ruler_actions, X_("toggle-cd-marker-ruler"), _("CD Markers"), sigc::mem_fun(*this, &Editor::toggle_ruler_visibility))); diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index 2bfecea509..682af077c2 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -142,6 +142,12 @@ Editor::initialize_canvas () _time_markers_group = new ArdourCanvas::Container (h_scroll_group); CANVAS_DEBUG_NAME (_time_markers_group, "time bars"); + + /* Note that because of ascending-y-axis coordinates, this order is + * bottom-to-top. But further note that the actual order is set in + * ::update_ruler_visibility() + */ + cd_marker_group = new ArdourCanvas::Container (_time_markers_group, ArdourCanvas::Duple (0.0, 0.0)); CANVAS_DEBUG_NAME (cd_marker_group, "cd marker group"); /* the vide is temporarily placed a the same location as the @@ -159,6 +165,8 @@ Editor::initialize_canvas () CANVAS_DEBUG_NAME (tempo_group, "tempo group"); meter_group = new ArdourCanvas::Container (_time_markers_group, ArdourCanvas::Duple (0.0, (timebar_height * 5.0) + 1.0)); CANVAS_DEBUG_NAME (meter_group, "meter group"); + mapping_group = new ArdourCanvas::Container (_time_markers_group, ArdourCanvas::Duple (0.0, (timebar_height * 6.0) + 1.0)); + CANVAS_DEBUG_NAME (mapping_group, "mapping group"); float timebar_thickness = timebar_height; //was 4 float timebar_top = (timebar_height - timebar_thickness)/2; @@ -174,6 +182,12 @@ Editor::initialize_canvas () tempo_bar->set_outline(false); tempo_bar->set_outline_what(ArdourCanvas::Rectangle::BOTTOM); + mapping_bar = new ArdourCanvas::Rectangle (mapping_group, ArdourCanvas::Rect (0.0, 0.0, ArdourCanvas::COORD_MAX, timebar_height)); + CANVAS_DEBUG_NAME (tempo_bar, "Tempo Bar"); + mapping_bar->set_fill(true); + mapping_bar->set_outline(false); + mapping_bar->set_outline_what(ArdourCanvas::Rectangle::BOTTOM); + range_marker_bar = new ArdourCanvas::Rectangle (range_marker_group, ArdourCanvas::Rect (0.0, timebar_top, ArdourCanvas::COORD_MAX, timebar_btm)); CANVAS_DEBUG_NAME (range_marker_bar, "Range Marker Bar"); @@ -234,6 +248,7 @@ Editor::initialize_canvas () transport_punchout_line->hide(); tempo_bar->Event.connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_ruler_bar_event), tempo_bar, TempoBarItem, "tempo bar")); + mapping_bar->Event.connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_ruler_bar_event), tempo_bar, MappingBarItem, "mapping bar")); meter_bar->Event.connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_ruler_bar_event), meter_bar, MeterBarItem, "meter bar")); marker_bar->Event.connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_ruler_bar_event), marker_bar, MarkerBarItem, "marker bar")); cd_marker_bar->Event.connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_ruler_bar_event), cd_marker_bar, CdMarkerBarItem, "cd marker bar")); @@ -1041,6 +1056,8 @@ Editor::color_handler() tempo_bar->set_fill_color (UIConfiguration::instance().color_mod ("tempo bar", "marker bar")); + mapping_bar->set_fill_color (UIConfiguration::instance().color_mod ("mapping bar", "marker bar")); + marker_bar->set_fill_color (UIConfiguration::instance().color_mod ("marker bar", "marker bar")); marker_bar->set_outline_color (UIConfiguration::instance().color ("marker bar separator")); diff --git a/gtk2_ardour/editor_items.h b/gtk2_ardour/editor_items.h index 65ec0ee415..088f3030d8 100644 --- a/gtk2_ardour/editor_items.h +++ b/gtk2_ardour/editor_items.h @@ -43,6 +43,7 @@ enum ItemType { TempoMarkerItem, MeterBarItem, TempoBarItem, + MappingBarItem, RegionViewNameHighlight, RegionViewName, StartSelectionTrimItem, diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index e1c9c40dd4..4a6ca725a6 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -816,6 +816,9 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT return true; break; + case MappingBarItem: + break; + case TempoBarItem: case TempoCurveItem: if (!Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier) @@ -1690,6 +1693,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT case TransportMarkerBarItem: case CdMarkerBarItem: case TempoBarItem: + case MappingBarItem: case TempoCurveItem: case MeterBarItem: case VideoBarItem: @@ -1815,6 +1819,9 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT mouse_add_new_marker (where, Location::IsCueMarker); } return true; + case MappingBarItem: + return true; + case TempoBarItem: case TempoCurveItem: if (!_dragging_playhead && Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) { diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc index a82ca3eb24..14cffa7f90 100644 --- a/gtk2_ardour/editor_rulers.cc +++ b/gtk2_ardour/editor_rulers.cc @@ -173,8 +173,9 @@ Editor::initialize_rulers () lab_children.push_back (Element(timecode_label, PACK_SHRINK, PACK_START)); lab_children.push_back (Element(samples_label, PACK_SHRINK, PACK_START)); lab_children.push_back (Element(bbt_label, PACK_SHRINK, PACK_START)); - lab_children.push_back (Element(meter_label, PACK_SHRINK, PACK_START)); + lab_children.push_back (Element(mapping_label, PACK_SHRINK, PACK_START)); lab_children.push_back (Element(tempo_label, PACK_SHRINK, PACK_START)); + lab_children.push_back (Element(meter_label, PACK_SHRINK, PACK_START)); lab_children.push_back (Element(range_mark_label, PACK_SHRINK, PACK_START)); lab_children.push_back (Element(transport_mark_label, PACK_SHRINK, PACK_START)); lab_children.push_back (Element(cd_mark_label, PACK_SHRINK, PACK_START)); @@ -253,6 +254,11 @@ Editor::popup_ruler_menu (timepos_t const & where, ItemType t) } break; + case MappingBarItem: + ruler_items.push_back (MenuElem (_("New BBT Marker"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_add_new_tempo_event), where))); + ruler_items.push_back (MenuElem (_("New Tempo Marker"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_add_new_tempo_event), where))); + break; + case TempoBarItem: case TempoCurveItem: ruler_items.push_back (MenuElem (_("New Tempo"), sigc::bind (sigc::mem_fun(*this, &Editor::mouse_add_new_tempo_event), where))); @@ -328,6 +334,7 @@ Editor::store_ruler_visibility () node->set_property (X_("bbt"), ruler_bbt_action->get_active()); node->set_property (X_("meter"), ruler_meter_action->get_active()); node->set_property (X_("tempo"), ruler_tempo_action->get_active()); + node->set_property (X_("mapping"), ruler_mapping_action->get_active()); node->set_property (X_("rangemarker"), ruler_range_action->get_active()); node->set_property (X_("transportmarker"), ruler_loop_punch_action->get_active()); node->set_property (X_("cdmarker"), ruler_cd_marker_action->get_active()); @@ -362,6 +369,9 @@ Editor::restore_ruler_visibility () if (node->get_property ("tempo", yn)) { ruler_tempo_action->set_active (yn); } + if (node->get_property ("mapping", yn)) { + ruler_mapping_action->set_active (yn); + } if (node->get_property ("meter", yn)) { ruler_meter_action->set_active (yn); } @@ -441,6 +451,7 @@ Editor::update_ruler_visibility () /* gtk update probs require this (damn) */ meter_label.hide(); tempo_label.hide(); + mapping_label.hide(); range_mark_label.hide(); transport_mark_label.hide(); cd_mark_label.hide(); @@ -509,19 +520,19 @@ Editor::update_ruler_visibility () bbt_label.hide(); } - if (ruler_meter_action->get_active()) { - old_unit_pos = meter_group->position().y; + if (ruler_mapping_action->get_active()) { + old_unit_pos = mapping_group->position().y; if (tbpos != old_unit_pos) { - meter_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); + mapping_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); } - meter_group->show(); - meter_label.show(); + mapping_group->show(); + mapping_label.show(); tbpos += timebar_height; tbgpos += timebar_height; visible_timebars++; } else { - meter_group->hide(); - meter_label.hide(); + mapping_group->hide(); + mapping_label.hide(); } if (ruler_tempo_action->get_active()) { @@ -539,6 +550,21 @@ Editor::update_ruler_visibility () tempo_label.hide(); } + if (ruler_meter_action->get_active()) { + old_unit_pos = meter_group->position().y; + if (tbpos != old_unit_pos) { + meter_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); + } + meter_group->show(); + meter_label.show(); + tbpos += timebar_height; + tbgpos += timebar_height; + visible_timebars++; + } else { + meter_group->hide(); + meter_label.hide(); + } + if (ruler_range_action->get_active()) { old_unit_pos = range_marker_group->position().y; if (tbpos != old_unit_pos) { diff --git a/gtk2_ardour/enums.cc b/gtk2_ardour/enums.cc index 761268cde7..3a606d5cb7 100644 --- a/gtk2_ardour/enums.cc +++ b/gtk2_ardour/enums.cc @@ -161,6 +161,7 @@ setup_gtk_ardour_enums () REGISTER_ENUM (BBTMarkerItem); REGISTER_ENUM (MeterBarItem); REGISTER_ENUM (TempoBarItem); + REGISTER_ENUM (MappingBarItem); REGISTER_ENUM (RegionViewNameHighlight); REGISTER_ENUM (RegionViewName); REGISTER_ENUM (StartSelectionTrimItem); diff --git a/gtk2_ardour/ruler_dialog.cc b/gtk2_ardour/ruler_dialog.cc index eef69f0833..10d0b2c7c2 100644 --- a/gtk2_ardour/ruler_dialog.cc +++ b/gtk2_ardour/ruler_dialog.cc @@ -33,6 +33,7 @@ RulerDialog::RulerDialog () get_vbox()->pack_start (timecode_button); get_vbox()->pack_start (samples_button); get_vbox()->pack_start (bbt_button); + get_vbox()->pack_start (mapping_button); get_vbox()->pack_start (meter_button); get_vbox()->pack_start (tempo_button); get_vbox()->pack_start (range_button); @@ -48,6 +49,7 @@ RulerDialog::RulerDialog () connect_action (timecode_button, "timecode-ruler"); connect_action (minsec_button, "minsec-ruler"); connect_action (bbt_button, "bbt-ruler"); + connect_action (mapping_button, "mapping-ruler"); connect_action (tempo_button, "tempo-ruler"); connect_action (meter_button, "meter-ruler"); connect_action (loop_punch_button, "loop-punch-ruler"); diff --git a/gtk2_ardour/ruler_dialog.h b/gtk2_ardour/ruler_dialog.h index f06d7244b6..40e73fac75 100644 --- a/gtk2_ardour/ruler_dialog.h +++ b/gtk2_ardour/ruler_dialog.h @@ -40,6 +40,7 @@ private: Gtk::CheckButton minsec_button; Gtk::CheckButton bbt_button; Gtk::CheckButton tempo_button; + Gtk::CheckButton mapping_button; Gtk::CheckButton meter_button; Gtk::CheckButton loop_punch_button; Gtk::CheckButton range_button; diff --git a/gtk2_ardour/themes/blueberry_milk-ardour.colors b/gtk2_ardour/themes/blueberry_milk-ardour.colors index 3398a11712..a5ad95056c 100644 --- a/gtk2_ardour/themes/blueberry_milk-ardour.colors +++ b/gtk2_ardour/themes/blueberry_milk-ardour.colors @@ -178,6 +178,7 @@ + diff --git a/gtk2_ardour/themes/caineville-ardour.colors b/gtk2_ardour/themes/caineville-ardour.colors index 4c0b9ae560..9d9db7dc96 100644 --- a/gtk2_ardour/themes/caineville-ardour.colors +++ b/gtk2_ardour/themes/caineville-ardour.colors @@ -179,6 +179,7 @@ + diff --git a/gtk2_ardour/themes/clear_gray-ardour.colors b/gtk2_ardour/themes/clear_gray-ardour.colors index 22a9349995..ba3df0bbd9 100644 --- a/gtk2_ardour/themes/clear_gray-ardour.colors +++ b/gtk2_ardour/themes/clear_gray-ardour.colors @@ -179,6 +179,7 @@ + diff --git a/gtk2_ardour/themes/cubasish-ardour.colors b/gtk2_ardour/themes/cubasish-ardour.colors index 528b6c5169..d9d8f0c8d0 100644 --- a/gtk2_ardour/themes/cubasish-ardour.colors +++ b/gtk2_ardour/themes/cubasish-ardour.colors @@ -180,6 +180,7 @@ + diff --git a/gtk2_ardour/themes/dark-ardour.colors b/gtk2_ardour/themes/dark-ardour.colors index 9b63cc90e6..0eb9a6e69a 100644 --- a/gtk2_ardour/themes/dark-ardour.colors +++ b/gtk2_ardour/themes/dark-ardour.colors @@ -180,6 +180,7 @@ + diff --git a/gtk2_ardour/themes/diehard3-ardour.colors b/gtk2_ardour/themes/diehard3-ardour.colors index d6dca819d9..cfba541c5c 100644 --- a/gtk2_ardour/themes/diehard3-ardour.colors +++ b/gtk2_ardour/themes/diehard3-ardour.colors @@ -180,6 +180,7 @@ + diff --git a/gtk2_ardour/themes/recbox-ardour.colors b/gtk2_ardour/themes/recbox-ardour.colors index 8e150ca5ce..3d9aa3b177 100644 --- a/gtk2_ardour/themes/recbox-ardour.colors +++ b/gtk2_ardour/themes/recbox-ardour.colors @@ -180,6 +180,7 @@ + diff --git a/gtk2_ardour/themes/unastudia-ardour.colors b/gtk2_ardour/themes/unastudia-ardour.colors index 8841f76943..83880aff66 100644 --- a/gtk2_ardour/themes/unastudia-ardour.colors +++ b/gtk2_ardour/themes/unastudia-ardour.colors @@ -178,6 +178,7 @@ + diff --git a/gtk2_ardour/themes/xcolors-ardour.colors b/gtk2_ardour/themes/xcolors-ardour.colors index 219f7edfc8..08ca0264c9 100644 --- a/gtk2_ardour/themes/xcolors-ardour.colors +++ b/gtk2_ardour/themes/xcolors-ardour.colors @@ -179,6 +179,7 @@ +