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 @@
+