diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 5c8bdd1366..fd5d0c8f57 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -485,9 +485,6 @@ private: void update_transport_clocks (samplepos_t pos); void record_state_changed (); - ArdourWidgets::ArdourDropdown _varispeed_pulldown; - void set_default_play_spd_from_menu (double spd); - std::list _midi_tracer_windows; /* Transport Control */ diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 6b9d18bdeb..e404987e33 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -102,8 +102,6 @@ ARDOUR_UI::setup_tooltips () set_tip (latency_disable_button, _("Disable all Plugin Delay Compensation. This results in the shortest delay from live input to output, but any paths with delay-causing plugins will sound later than those without.")); - set_tip (_varispeed_pulldown, _("Varispeed: change the default playback and recording speed")); - synchronize_sync_source_and_video_pullup (); editor->setup_tooltips (); @@ -534,7 +532,7 @@ ARDOUR_UI::setup_transport () ssbox->set_spacing (PX_SCALE(2)); ssbox->pack_start (sync_button, false, false, 0); ssbox->pack_start (shuttle_box, true, true, 0); - ssbox->pack_start (_varispeed_pulldown, false, false, 0); + ssbox->pack_start (*shuttle_box.vari_button(), false, false, 0); ssbox->pack_start (*shuttle_box.info_button(), false, false, 0); /* and the main table layout */ @@ -636,20 +634,6 @@ ARDOUR_UI::setup_transport () transport_table.attach (editor_visibility_button, TCOL, 0, 1 , FILL, SHRINK, hpadding, vpadding); ++col; -// _varispeed_pulldown.set_icon (ArdourIcon::RecButton); - _varispeed_pulldown.set_text(_("Vari")); -// _varispeed_pulldown.set_icon(record_tape_red); - _varispeed_pulldown.AddMenuElem (MenuElem (_("None"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_default_play_spd_from_menu), 1.0))); - _varispeed_pulldown.AddMenuElem (SeparatorElem()); - _varispeed_pulldown.AddMenuElem (MenuElem (_("-10 cents"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_default_play_spd_from_menu), ShuttleControl::cents_as_speed(-10, false)))); - _varispeed_pulldown.AddMenuElem (MenuElem (_("+10 cents"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_default_play_spd_from_menu), ShuttleControl::cents_as_speed(10, false)))); - _varispeed_pulldown.AddMenuElem (SeparatorElem()); - _varispeed_pulldown.AddMenuElem (MenuElem (_("-1 semitone"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_default_play_spd_from_menu), ShuttleControl::semitones_as_speed(-1, false)))); - _varispeed_pulldown.AddMenuElem (MenuElem (_("+1 semitone"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_default_play_spd_from_menu), ShuttleControl::semitones_as_speed(1, false)))); - _varispeed_pulldown.AddMenuElem (SeparatorElem()); - _varispeed_pulldown.AddMenuElem (MenuElem (_("-1 octave"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_default_play_spd_from_menu), ShuttleControl::semitones_as_speed(-12, false)))); - _varispeed_pulldown.AddMenuElem (MenuElem (_("+1 octave"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_default_play_spd_from_menu), ShuttleControl::semitones_as_speed(12, false)))); - /* initialize */ latency_switch_changed (); session_latency_updated (true); @@ -769,12 +753,6 @@ ARDOUR_UI::layered_button_clicked () } } -void -ARDOUR_UI::set_default_play_spd_from_menu (double spd) -{ - _session->set_default_play_speed(spd); -} - void ARDOUR_UI::solo_blink (bool onoff) { diff --git a/gtk2_ardour/shuttle_control.cc b/gtk2_ardour/shuttle_control.cc index 20925778ad..dcacc261b6 100644 --- a/gtk2_ardour/shuttle_control.cc +++ b/gtk2_ardour/shuttle_control.cc @@ -45,6 +45,7 @@ #include "rgb_macros.h" #include "shuttle_control.h" #include "timers.h" +#include "transpose_dialog.h" #include "pbd/i18n.h" @@ -177,6 +178,13 @@ ShuttleControl::ShuttleControl () UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &ShuttleControl::set_colors)); Timers::blink_connect (sigc::mem_fun (*this, &ShuttleControl::do_blink)); + set_tooltip (_vari_button, _("Varispeed: change the default playback and recording speed")); + +// _vari_button.set_icon (ArdourIcon::RecButton); + _vari_button.set_name ("vari button"); + _vari_button.set_text(_("Vari")); + _vari_button.signal_clicked.connect (sigc::mem_fun (*this, &ShuttleControl::varispeed_button_clicked)); + /* gtkmm 2.4: the C++ wrapper doesn't work */ g_signal_connect ((GObject*) gobj(), "query-tooltip", G_CALLBACK (qt), NULL); // signal_query_tooltip().connect (sigc::mem_fun (*this, &ShuttleControl::on_query_tooltip)); @@ -189,13 +197,28 @@ ShuttleControl::~ShuttleControl () delete shuttle_context_menu; } +void +ShuttleControl::varispeed_button_clicked () +{ + _vari_dialog.set_session(_session); + if (_session->default_play_speed()==1.0) { + _vari_dialog.show_all (); + _vari_dialog.apply_speed (); + } else { + _session->set_default_play_speed(1.0); + _vari_dialog.hide (); + } +} + void ShuttleControl::do_blink (bool onoff) { if (!shuttle_grabbed && _session && _session->default_play_speed()!=1.0) { _info_button.set_active(onoff); + _vari_button.set_active(onoff); } else { _info_button.set_active(false); + _vari_button.set_active(false); } } diff --git a/gtk2_ardour/shuttle_control.h b/gtk2_ardour/shuttle_control.h index 6e8c25c032..87476a6439 100644 --- a/gtk2_ardour/shuttle_control.h +++ b/gtk2_ardour/shuttle_control.h @@ -32,6 +32,8 @@ #include "widgets/ardour_button.h" #include "widgets/binding_proxy.h" +#include "transpose_dialog.h" + namespace Gtk { class Menu; } @@ -83,6 +85,7 @@ public: void set_colors (); ArdourWidgets::ArdourButton* info_button () { return &_info_button; } + ArdourWidgets::ArdourButton* vari_button () { return &_vari_button; } public: static int speed_as_semitones (float, bool&); @@ -115,6 +118,10 @@ protected: void build_shuttle_context_menu (); void set_shuttle_max_speed (float); + VarispeedDialog _vari_dialog; + ArdourWidgets::ArdourButton _vari_button; + void varispeed_button_clicked (); + bool on_enter_notify_event (GdkEventCrossing*); bool on_leave_notify_event (GdkEventCrossing*); bool on_button_press_event (GdkEventButton*); diff --git a/gtk2_ardour/themes/dark-ardour.colors b/gtk2_ardour/themes/dark-ardour.colors index 7a3004ee0a..2e27c43948 100644 --- a/gtk2_ardour/themes/dark-ardour.colors +++ b/gtk2_ardour/themes/dark-ardour.colors @@ -387,7 +387,8 @@ - + + diff --git a/gtk2_ardour/transpose_dialog.cc b/gtk2_ardour/transpose_dialog.cc index ac03d9e9bd..bb980007ff 100644 --- a/gtk2_ardour/transpose_dialog.cc +++ b/gtk2_ardour/transpose_dialog.cc @@ -22,6 +22,8 @@ #include "transpose_dialog.h" #include "pbd/i18n.h" +#include + using namespace Gtk; TransposeDialog::TransposeDialog () @@ -60,3 +62,78 @@ TransposeDialog::semitones () const { return _octaves_spinner.get_value () * 12 + _semitones_spinner.get_value (); } + + + + + +VarispeedDialog::VarispeedDialog () + : ArdourDialog (_("Varispeed")) + , _octaves_adjustment (0.0, -4.0, 4.0, 1, 2.0) + , _semitones_adjustment (0.0, -12.0, 12.0, 1.0, 4.0) + , _cents_adjustment (0.0, -100.0, 100.0, 1.0, 10.0) + , _octaves_spinner (_octaves_adjustment) + , _semitones_spinner (_semitones_adjustment) + , _cents_spinner (_cents_adjustment) +{ + set_modal(false); + + Table* t = manage (new Table (3, 2)); + t->set_row_spacings (6); + t->set_col_spacings (6); + + int r = 0; + Label* l = manage (new Label (_("Octaves:"), ALIGN_LEFT, ALIGN_CENTER, false)); + t->attach (*l, 0, 1, r, r + 1, FILL, EXPAND, 0, 0); + t->attach (_octaves_spinner, 1, 2, r, r + 1, FILL, EXPAND & FILL, 0, 0); + ++r; + + l = manage (new Label (_("Semitones:"), ALIGN_LEFT, ALIGN_CENTER, false)); + t->attach (*l, 0, 1, r, r + 1, FILL, EXPAND, 0, 0); + t->attach (_semitones_spinner, 1, 2, r, r + 1, FILL, EXPAND & FILL, 0, 0); + ++r; + + l = manage (new Label (_("Cents:"), ALIGN_LEFT, ALIGN_CENTER, false)); + t->attach (*l, 0, 1, r, r + 1, FILL, EXPAND, 0, 0); + t->attach (_cents_spinner, 1, 2, r, r + 1, FILL, EXPAND & FILL, 0, 0); + ++r; + + get_vbox()->set_spacing (6); + get_vbox()->pack_start (*t, false, false); + +// add_button (Stock::CANCEL, RESPONSE_CANCEL); +// add_button (_("Transpose"), RESPONSE_ACCEPT); + + _octaves_spinner.signal_changed().connect (sigc::mem_fun (*this, &VarispeedDialog::apply_speed)); + _semitones_spinner.signal_changed().connect (sigc::mem_fun (*this, &VarispeedDialog::apply_speed)); + _cents_spinner.signal_changed().connect (sigc::mem_fun (*this, &VarispeedDialog::apply_speed)); + + show_all_children (); +} + +void +VarispeedDialog::reset () +{ + _octaves_spinner.set_value(0); + _semitones_spinner.set_value(0); + _cents_spinner.set_value(0); +} + +void +VarispeedDialog::apply_speed () +{ + int cents = _octaves_spinner.get_value () * 12 * 100 + _semitones_spinner.get_value () * 100 + _cents_spinner.get_value (); + + double speed = pow (2.0, ((double)cents / (double)1200.0)); + + if (_session) { + _session->set_default_play_speed(speed); + } +} + +void +VarispeedDialog::on_hide () +{ + _session->set_default_play_speed(1.0); + ArdourDialog::on_hide(); +} diff --git a/gtk2_ardour/transpose_dialog.h b/gtk2_ardour/transpose_dialog.h index f1fceff7dc..813885f799 100644 --- a/gtk2_ardour/transpose_dialog.h +++ b/gtk2_ardour/transpose_dialog.h @@ -16,9 +16,14 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#ifndef __ardour_transpose_dialog_h__ +#define __ardour_transpose_dialog_h__ + #include #include "ardour_dialog.h" + + /** A dialog box to select a transposition to apply to a MIDI region. * It asks for octaves and semitones, with the transposition being * the sum of the two. @@ -37,3 +42,28 @@ private: Gtk::SpinButton _octaves_spinner; Gtk::SpinButton _semitones_spinner; }; + + +/** A dialog box to select a speed change for "varispeed" recording/playback. + * It asks for octaves, semitones, and cents, and sums them to report 'speed' + */ + +class VarispeedDialog : public ArdourDialog +{ +public: + VarispeedDialog (); + + void reset (); + void apply_speed (); + void on_hide (); + +private: + Gtk::Adjustment _octaves_adjustment; + Gtk::Adjustment _semitones_adjustment; + Gtk::Adjustment _cents_adjustment; + Gtk::SpinButton _octaves_spinner; + Gtk::SpinButton _semitones_spinner; + Gtk::SpinButton _cents_spinner; +}; + +#endif /* __ardour_transpose_dialog_h__ */