From b0efb9f4347539279f6b4309d75fab8cb97140f4 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 6 Aug 2007 16:43:14 +0000 Subject: [PATCH] Added missing files. git-svn-id: svn://localhost/ardour2/trunk@2258 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/quantize.h | 41 +++++++++ libs/ardour/quantize.cc | 168 ++++++++++++++++++++++++++++++++++ 2 files changed, 209 insertions(+) create mode 100644 libs/ardour/ardour/quantize.h create mode 100644 libs/ardour/quantize.cc diff --git a/libs/ardour/ardour/quantize.h b/libs/ardour/ardour/quantize.h new file mode 100644 index 0000000000..143652dc63 --- /dev/null +++ b/libs/ardour/ardour/quantize.h @@ -0,0 +1,41 @@ +/* + Copyright (C) 2007 Paul Davis + Author: Dave Robillard + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __ardour_quantize_h__ +#define __ardour_quantize_h__ + +#include + +namespace ARDOUR { + +class Quantize : public Filter { +public: + Quantize (ARDOUR::Session&, double q); + ~Quantize (); + + int run (boost::shared_ptr); + +private: + double _q; +}; + +} /* namespace */ + +#endif /* __ardour_quantize_h__ */ diff --git a/libs/ardour/quantize.cc b/libs/ardour/quantize.cc new file mode 100644 index 0000000000..5bee86d0c4 --- /dev/null +++ b/libs/ardour/quantize.cc @@ -0,0 +1,168 @@ +/* + Copyright (C) 2004 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include + +#include +#include +#include +#include +#include +#include + +#include "i18n.h" + +using namespace std; +using namespace ARDOUR; + + +/** Quantize notes, valid for MIDI regions only. + * + * Q is the quantize value in beats, ie 1.0 = quantize to beats, + * 0.25 = quantize to beats/4, etc. + */ +Quantize::Quantize (Session& s, double q) + : Filter (s) + , _q(q) +{ +} + +Quantize::~Quantize () +{ +} + +int +Quantize::run (boost::shared_ptr r) +{ + boost::shared_ptr region = boost::dynamic_pointer_cast(r); + if (!region) + return -1; + + // FIXME: how to make a whole file region if it isn't? + //assert(region->whole_file()); + + boost::shared_ptr src = region->midi_source(0); + src->load_model(); + + boost::shared_ptr model = src->model(); + + // FIXME: Model really needs to be switched to beat time (double) ASAP + + const Tempo& t = session.tempo_map().tempo_at(r->start()); + const Meter& m = session.tempo_map().meter_at(r->start()); + + double q_frames = _q * (m.frames_per_bar(t, session.frame_rate()) / (double)m.beats_per_bar()); + + for (MidiModel::Notes::iterator i = model->notes().begin(); i != model->notes().end(); ++i) { + const double new_time = lrint(i->time() / q_frames) * q_frames; + const double new_dur = ((i->time() != 0 && new_dur < (q_frames * 1.5)) + ? q_frames + : lrint(i->duration() / q_frames) * q_frames); + + i->set_time(new_time); + i->set_duration(new_dur); + } + + 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 region = boost::dynamic_pointer_cast(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 asrc(boost::dynamic_pointer_cast(*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 asrc(boost::dynamic_pointer_cast(*si)); + asrc->mark_for_remove (); + } + } + + return ret; +#endif +}