diff options
author | David Robillard <d@drobilla.net> | 2008-01-10 22:22:29 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2008-01-10 22:22:29 +0000 |
commit | 8a2e30816ee392b871c5918f769f68cc0196a893 (patch) | |
tree | eb85739049c0adc6186eea635aaaf65ef03f038f /gtk2_ardour/editor_timefx.cc | |
parent | bb457bb960c5bd7ed538f9d31477293415739f68 (diff) |
Merge with 2.0-ongoing R2883.
git-svn-id: svn://localhost/ardour2/trunk@2885 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/editor_timefx.cc')
-rw-r--r-- | gtk2_ardour/editor_timefx.cc | 132 |
1 files changed, 112 insertions, 20 deletions
diff --git a/gtk2_ardour/editor_timefx.cc b/gtk2_ardour/editor_timefx.cc index 015a265a9b..2b91c6df28 100644 --- a/gtk2_ardour/editor_timefx.cc +++ b/gtk2_ardour/editor_timefx.cc @@ -17,6 +17,7 @@ */ +#include <iostream> #include <cstdlib> #include <cmath> @@ -27,6 +28,7 @@ #include <pbd/memento_command.h> #include <gtkmm2ext/window_title.h> +#include <gtkmm2ext/utils.h> #include "editor.h" #include "audio_time_axis.h" @@ -42,8 +44,14 @@ #include <ardour/stretch.h> #include <ardour/pitch.h> +#ifdef USE_RUBBERBAND +#include <rubberband/RubberBandStretcher.h> +using namespace RubberBand; +#endif + #include "i18n.h" +using namespace std; using namespace ARDOUR; using namespace PBD; using namespace sigc; @@ -54,14 +62,16 @@ Editor::TimeFXDialog::TimeFXDialog (Editor& e, bool pitch) : ArdourDialog (X_("time fx dialog")), editor (e), pitching (pitch), - pitch_octave_adjustment (0.0, 0.0, 4.0, 1, 2.0), - pitch_semitone_adjustment (0.0, 0.0, 12.0, 1.0, 4.0), - pitch_cent_adjustment (0.0, 0.0, 150.0, 5.0, 15.0), + pitch_octave_adjustment (0.0, -4.0, 4.0, 1, 2.0), + pitch_semitone_adjustment (0.0, -12.0, 12.0, 1.0, 4.0), + pitch_cent_adjustment (0.0, -499.0, 500.0, 5.0, 15.0), pitch_octave_spinner (pitch_octave_adjustment), pitch_semitone_spinner (pitch_semitone_adjustment), pitch_cent_spinner (pitch_cent_adjustment), quick_button (_("Quick but Ugly")), - antialias_button (_("Skip Anti-aliasing")) + antialias_button (_("Skip Anti-aliasing")), + stretch_opts_label (_("Contents:")), + precise_button (_("Strict Linear")) { set_modal (true); set_position (Gtk::WIN_POS_MOUSE); @@ -79,8 +89,6 @@ Editor::TimeFXDialog::TimeFXDialog (Editor& e, bool pitch) get_vbox()->set_spacing (5); get_vbox()->set_border_width (12); - get_vbox()->pack_start (upper_button_box, false, false); - get_vbox()->pack_start (progress_bar); if (pitching) { @@ -105,19 +113,44 @@ Editor::TimeFXDialog::TimeFXDialog (Editor& e, bool pitch) add_button (_("Shift"), Gtk::RESPONSE_ACCEPT); + get_vbox()->pack_start (upper_button_box, false, false); + } else { +#ifdef USE_RUBBERBAND + opts_box.set_spacing (5); + opts_box.set_border_width (5); + vector<string> strings; + + set_popdown_strings (stretch_opts_selector, editor.rb_opt_strings); + /* set default */ + stretch_opts_selector.set_active_text (editor.rb_opt_strings[4]); + + opts_box.pack_start (precise_button, false, false); + opts_box.pack_start (stretch_opts_label, false, false); + opts_box.pack_start (stretch_opts_selector, false, false); + + get_vbox()->pack_start (opts_box, false, false); + +#else upper_button_box.set_homogeneous (true); upper_button_box.set_spacing (5); upper_button_box.set_border_width (5); + upper_button_box.pack_start (quick_button, true, true); upper_button_box.pack_start (antialias_button, true, true); - + + quick_button.set_name (N_("TimeFXButton")); + antialias_button.set_name (N_("TimeFXButton")); + + get_vbox()->pack_start (upper_button_box, false, false); + +#endif add_button (_("Stretch/Shrink"), Gtk::RESPONSE_ACCEPT); } - quick_button.set_name (N_("TimeFXButton")); - antialias_button.set_name (N_("TimeFXButton")); + get_vbox()->pack_start (progress_bar); + progress_bar.set_name (N_("TimeFXProgress")); show_all_children (); @@ -184,6 +217,7 @@ Editor::time_fx (RegionSelection& regions, float val, bool pitching) if (pitching) { float cents = current_timefx->pitch_octave_adjustment.get_value() * 1200.0; + float pitch_fraction; cents += current_timefx->pitch_semitone_adjustment.get_value() * 100.0; cents += current_timefx->pitch_cent_adjustment.get_value(); @@ -193,28 +227,86 @@ Editor::time_fx (RegionSelection& regions, float val, bool pitching) return 0; } - // we now have the pitch shift in cents. divide by 1200 to get octaves - // then multiply by 2.0 because 1 octave == doubling the frequency + // one octave == 1200 cents + // adding one octave doubles the frequency + // ratio is 2^^octaves + + pitch_fraction = pow(2, cents/1200); + + current_timefx->request.time_fraction = 1.0; + current_timefx->request.pitch_fraction = pitch_fraction; - cents /= 1200.0; - cents /= 2.0; + } else { + + current_timefx->request.time_fraction = val; + current_timefx->request.pitch_fraction = 1.0; - // add 1.0 to convert to RB scale + } - cents += 1.0; +#ifdef USE_RUBBERBAND + /* parse options */ - current_timefx->request.time_fraction = 1.0; - current_timefx->request.pitch_fraction = cents; + RubberBandStretcher::Options options = 0; + bool realtime = false; + bool precise = false; + bool peaklock = true; + bool softening = true; + bool longwin = false; + bool shortwin = false; + string txt; + + enum { + NoTransients, + BandLimitedTransients, + Transients + } transients = Transients; + + precise = current_timefx->precise_button.get_active(); + + txt = current_timefx->stretch_opts_selector.get_active_text (); + + if (txt == rb_opt_strings[0]) { + transients = NoTransients; peaklock = false; longwin = true; shortwin = false; + } else if (txt == rb_opt_strings[1]) { + transients = NoTransients; peaklock = false; longwin = false; shortwin = false; + } else if (txt == rb_opt_strings[2]) { + transients = NoTransients; peaklock = true; longwin = false; shortwin = false; + } else if (txt == rb_opt_strings[3]) { + transients = BandLimitedTransients; peaklock = true; longwin = false; shortwin = false; + } else if (txt == rb_opt_strings[5]) { + transients = Transients; peaklock = false; longwin = false; shortwin = true; } else { + /* default/4 */ + + transients = Transients; peaklock = true; longwin = false; shortwin = false; + }; - current_timefx->request.time_fraction = val; - current_timefx->request.pitch_fraction = 1.0; + if (realtime) options |= RubberBandStretcher::OptionProcessRealTime; + if (precise) options |= RubberBandStretcher::OptionStretchPrecise; + if (!peaklock) options |= RubberBandStretcher::OptionPhaseIndependent; + if (!softening) options |= RubberBandStretcher::OptionPhasePeakLocked; + if (longwin) options |= RubberBandStretcher::OptionWindowLong; + if (shortwin) options |= RubberBandStretcher::OptionWindowShort; + + switch (transients) { + case NoTransients: + options |= RubberBandStretcher::OptionTransientsSmooth; + break; + case BandLimitedTransients: + options |= RubberBandStretcher::OptionTransientsMixed; + break; + case Transients: + options |= RubberBandStretcher::OptionTransientsCrisp; + break; } + current_timefx->request.opts = (int) options; +#else current_timefx->request.quick_seek = current_timefx->quick_button.get_active(); current_timefx->request.antialias = !current_timefx->antialias_button.get_active(); +#endif current_timefx->request.progress = 0.0f; current_timefx->request.done = false; current_timefx->request.cancel = false; @@ -239,7 +331,7 @@ Editor::time_fx (RegionSelection& regions, float val, bool pitching) sigc::connection c = Glib::signal_timeout().connect (mem_fun (current_timefx, &TimeFXDialog::update_progress), 100); - while (!current_timefx->request.done) { + while (!current_timefx->request.done && !current_timefx->request.cancel) { gtk_main_iteration (); } |