Default_Play_Speed: 2nd attempt at varispeed GUI

This commit is contained in:
Ben Loftis 2021-06-27 16:25:33 -05:00 committed by Robin Gareus
parent 45c57354ec
commit d1941c9cbc
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
7 changed files with 140 additions and 27 deletions

View File

@ -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<MidiTracer*> _midi_tracer_windows;
/* Transport Control */

View File

@ -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)
{

View File

@ -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);
}
}

View File

@ -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*);

View File

@ -387,7 +387,8 @@
<ColorAlias name="shuttle" alias="widget:bg"/>
<ColorAlias name="shuttle bg" alias="neutral:backgroundest"/>
<ColorAlias name="shuttle text: fill" alias="neutral:foregroundest"/>
<ColorAlias name="shuttle text: fill active" alias="alert:red"/>
<ColorAlias name="vari button: fill" alias="widget:bg"/>
<ColorAlias name="vari button: fill active" alias="alert:ruddy"/>
<ColorAlias name="silence" alias="theme:contrasting alt"/>
<ColorAlias name="silence text" alias="neutral:foreground"/>
<ColorAlias name="solo button: fill" alias="widget:bg"/>

View File

@ -22,6 +22,8 @@
#include "transpose_dialog.h"
#include "pbd/i18n.h"
#include <ardour/session.h>
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();
}

View File

@ -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 <gtkmm/spinbutton.h>
#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__ */