diff options
-rw-r--r-- | gtk2_ardour/editor_mouse.cc | 12 | ||||
-rw-r--r-- | gtk2_ardour/editor_timefx.cc | 30 | ||||
-rw-r--r-- | libs/ardour/SConscript | 1 | ||||
-rw-r--r-- | libs/ardour/ardour/stretch.h | 4 | ||||
-rw-r--r-- | libs/ardour/ardour/types.h | 2 | ||||
-rw-r--r-- | libs/ardour/quantize.cc | 85 |
6 files changed, 40 insertions, 94 deletions
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 06f0243805..9689cdc64a 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -5331,11 +5331,15 @@ Editor::end_time_fx (ArdourCanvas::Item* item, GdkEvent* event) } nframes_t newlen = drag_info.last_pointer_frame - clicked_regionview->region()->position(); -#ifdef USE_RUBBERBAND - float percentage = (float) ((double) newlen / (double) clicked_regionview->region()->length()); -#else - float percentage = (float) ((double) newlen - (double) clicked_regionview->region()->length()) / ((double) newlen) * 100.0f; + + float percentage = (double) newlen / (double) clicked_regionview->region()->length(); + +#ifndef USE_RUBBERBAND + // Soundtouch uses percentage / 100 instead of normal (/ 1) + if (clicked_regionview->region()->data_type() == DataType::AUDIO) { + percentage = (float) ((double) newlen - (double) clicked_regionview->region()->length()) / ((double) newlen) * 100.0f; #endif + } begin_reversible_command (_("timestretch")); diff --git a/gtk2_ardour/editor_timefx.cc b/gtk2_ardour/editor_timefx.cc index 2b91c6df28..652973ca26 100644 --- a/gtk2_ardour/editor_timefx.cc +++ b/gtk2_ardour/editor_timefx.cc @@ -42,6 +42,7 @@ #include <ardour/audioregion.h> #include <ardour/audio_diskstream.h> #include <ardour/stretch.h> +#include <ardour/midi_stretch.h> #include <ardour/pitch.h> #ifdef USE_RUBBERBAND @@ -183,7 +184,34 @@ Editor::TimeFXDialog::delete_in_progress (GdkEventAny* ev) int Editor::time_stretch (RegionSelection& regions, float fraction) { - return time_fx (regions, fraction, false); + // FIXME: kludge, implement stretching of selection of both types + + if (regions.front()->region()->data_type() == DataType::AUDIO) { + // Audio, pop up timefx dialog + return time_fx (regions, fraction, false); + } else { + // MIDI, just stretch + RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (®ions.front()->get_time_axis_view()); + if (!rtv) + return -1; + + boost::shared_ptr<Playlist> playlist + = rtv->track()->diskstream()->playlist(); + + ARDOUR::TimeFXRequest request; + request.time_fraction = fraction; + MidiStretch stretch(*session, request); + begin_reversible_command ("midi stretch"); + stretch.run(regions.front()->region()); + XMLNode &before = playlist->get_state(); + playlist->replace_region (regions.front()->region(), stretch.results[0], + regions.front()->region()->position()); + XMLNode &after = playlist->get_state(); + session->add_command (new MementoCommand<Playlist>(*playlist, &before, &after)); + commit_reversible_command (); + } + + return 0; } int diff --git a/libs/ardour/SConscript b/libs/ardour/SConscript index 4246c3c99a..dce544b622 100644 --- a/libs/ardour/SConscript +++ b/libs/ardour/SConscript @@ -84,6 +84,7 @@ midi_playlist.cc midi_port.cc midi_region.cc midi_source.cc +midi_stretch.cc midi_track.cc mix.cc mtc_slave.cc diff --git a/libs/ardour/ardour/stretch.h b/libs/ardour/ardour/stretch.h index 020d03270d..b01a9ae208 100644 --- a/libs/ardour/ardour/stretch.h +++ b/libs/ardour/ardour/stretch.h @@ -22,10 +22,6 @@ #include <ardour/filter.h> -namespace ARDOUR { - class AudioRegion; -} - #ifdef USE_RUBBERBAND #include <ardour/rb_effect.h> diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 48b41cbd96..dd151abaf6 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -380,6 +380,8 @@ namespace ARDOUR { }; struct TimeFXRequest : public InterThreadInfo { + TimeFXRequest() : time_fraction(0), pitch_fraction(0), + quick_seek(false), antialias(false), opts(0) {} float time_fraction; float pitch_fraction; /* SoundTouch */ diff --git a/libs/ardour/quantize.cc b/libs/ardour/quantize.cc index c29144996c..de3ed4ef22 100644 --- a/libs/ardour/quantize.cc +++ b/libs/ardour/quantize.cc @@ -82,89 +82,4 @@ Quantize::run (boost::shared_ptr<Region> r) model->set_edited(true); return 0; -#if 0 - SourceList nsrcs; - SourceList::iterator si; - nframes_t blocksize = 256 * 1024; - Sample* buf = 0; - nframes_t fpos; - nframes_t fstart; - nframes_t to_read; - int ret = -1; - - boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion>(r); - if (!region) - return ret; - - /* create new sources */ - - if (make_new_sources (region, nsrcs)) { - goto out; - } - - fstart = region->start(); - - if (blocksize > region->length()) { - blocksize = region->length(); - } - - fpos = max (fstart, (fstart + region->length() - blocksize)); - buf = new Sample[blocksize]; - to_read = blocksize; - - /* now read it backwards */ - - while (to_read) { - - uint32_t n; - - for (n = 0, si = nsrcs.begin(); n < region->n_channels(); ++n, ++si) { - - /* read it in */ - - if (region->audio_source (n)->read (buf, fpos, to_read) != to_read) { - goto out; - } - - /* swap memory order */ - - for (nframes_t i = 0; i < to_read/2; ++i) { - swap (buf[i],buf[to_read-1-i]); - } - - /* write it out */ - - boost::shared_ptr<AudioSource> asrc(boost::dynamic_pointer_cast<AudioSource>(*si)); - - if (asrc && asrc->write (buf, to_read) != to_read) { - goto out; - } - } - - if (fpos > fstart + blocksize) { - fpos -= to_read; - to_read = blocksize; - } else { - to_read = fpos - fstart; - fpos = fstart; - } - }; - - ret = finish (region, nsrcs); - - out: - - if (buf) { - delete [] buf; - } - - if (ret) { - for (si = nsrcs.begin(); si != nsrcs.end(); ++si) { - boost::shared_ptr<AudioSource> asrc(boost::dynamic_pointer_cast<AudioSource>(*si)); - asrc->mark_for_remove (); - } - } - - return ret; -#endif } |