From 81d751e8824f6a9b3975c1da517d1d163a2eace5 Mon Sep 17 00:00:00 2001 From: Tim Blechmann Date: Sat, 20 Sep 2003 00:05:08 +0000 Subject: *** empty log message *** svn path=/trunk/externals/tb/; revision=1012 --- tbext/source/fftgrrev.cpp | 165 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 tbext/source/fftgrrev.cpp (limited to 'tbext/source/fftgrrev.cpp') diff --git a/tbext/source/fftgrrev.cpp b/tbext/source/fftgrrev.cpp new file mode 100644 index 0000000..e26135c --- /dev/null +++ b/tbext/source/fftgrrev.cpp @@ -0,0 +1,165 @@ +/* Copyright (c) 2003 Tim Blechmann. */ +/* For information on usage and redistribution, and for a DISCLAIMER OF ALL */ +/* WARRANTIES, see the file, "COPYING" in this distribution. */ +/* */ +/* */ +/* fftgrshuf divides the incoming fft signal into single grains and reverses */ +/* the samples in every grain */ +/* */ +/* fftgrrev uses the flext C++ layer for Max/MSP and PD externals. */ +/* get it at http://www.parasitaere-kapazitaeten.de/PD/ext */ +/* thanks to Thomas Grill */ +/* */ +/* */ +/* */ +/* 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. */ +/* */ +/* See file LICENSE for further informations on licensing terms. */ +/* */ +/* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/* */ +/* Based on PureData by Miller Puckette and others. */ +/* */ +/* */ +/* */ +/* coded while listening to: Howard Skempton/John Tilbury: Well, well, Cornelius*/ +/* */ +/* */ + + + +#include +#include + +#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 401) +#error upgrade your flext version!!!!!! +#endif + +class fftgrrev: public flext_dsp +{ + FLEXT_HEADER(fftgrrev,flext_dsp); + +public: // constructor + fftgrrev(int); + +protected: + virtual void m_signal (int n, float *const *in, float *const *out); + void set_grains(t_int); + void set_offset(t_int); + void set_reverse(); + +private: + FLEXT_CALLBACK_1(set_grains,t_int) + FLEXT_CALLBACK_1(set_offset,t_int) + + t_int grains; + t_int grainsize; + t_int offset; + + t_int bs; //blocksize + t_int bs1; //bs+1 + t_int counter; + + t_sample * data; //array with data + t_sample * d1; //1. element in array with data + t_sample * dend; //1 element after the last element + + t_sample * ins; + t_sample * outs; + + bool reverse; + +}; + + +FLEXT_LIB_DSP_1("fftgrrev~",fftgrrev,int) + +fftgrrev::fftgrrev(int arg): + grains(1),offset(0),counter(1) +{ + bs=arg/2; + grainsize=bs; + bs1=bs+1; + post("blocksize: %i",bs); + + data = new t_sample[bs+1]; + + data[0]=0; + d1=data+1; + dend=data+bs+1; + + AddInSignal(); + AddOutSignal(); + FLEXT_ADDMETHOD_I(0,"grains",set_grains); + FLEXT_ADDMETHOD_I(0,"offset",set_offset); +} + +void fftgrrev::m_signal(int n, t_float * const *in, t_float *const *out) +{ + ins = in[0]; + outs = out[0]; + + + if (offset>0) + { + CopySamples(d1+bs-offset,ins,offset); + CopySamples(d1,ins+offset,bs-offset); + } + else if (offset<0) + { + CopySamples(d1-offset,ins,bs+offset); + CopySamples(d1,ins+bs+offset,-offset); + } + else + CopySamples(data,ins,bs1); + + + //grains + + counter=1; + + while (counter!=grains) + { + std::reverse(d1+grainsize*(counter-1),d1+grainsize*counter); + ++counter; + } + + std::reverse(d1+grainsize*(counter-1),dend); + + CopySamples(outs,data,bs1); +} + +void fftgrrev::set_offset(t_int o) +{ + if (o-bs<0 && o+bs>0) + { + offset=-o; + post("offset %i",o); + } + else + post("Offset out of range!"); +} + + +void fftgrrev::set_grains(t_int g) +{ + if ( (g > 0) ) + { + grains=g; + grainsize=(bs)/grains; + } +} + + + + -- cgit v1.2.1 From 17bd73bf9c9da670727345b00e639398a8f3d296 Mon Sep 17 00:00:00 2001 From: Tim Blechmann Date: Tue, 7 Sep 2004 09:13:52 +0000 Subject: *** empty log message *** svn path=/trunk/externals/tb/; revision=2015 --- tbext/source/fftgrrev.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) (limited to 'tbext/source/fftgrrev.cpp') diff --git a/tbext/source/fftgrrev.cpp b/tbext/source/fftgrrev.cpp index e26135c..fd844f0 100644 --- a/tbext/source/fftgrrev.cpp +++ b/tbext/source/fftgrrev.cpp @@ -68,14 +68,11 @@ private: t_int bs; //blocksize t_int bs1; //bs+1 - t_int counter; t_sample * data; //array with data t_sample * d1; //1. element in array with data t_sample * dend; //1 element after the last element - t_sample * ins; - t_sample * outs; bool reverse; @@ -85,7 +82,7 @@ private: FLEXT_LIB_DSP_1("fftgrrev~",fftgrrev,int) fftgrrev::fftgrrev(int arg): - grains(1),offset(0),counter(1) + grains(1),offset(0) { bs=arg/2; grainsize=bs; @@ -106,9 +103,8 @@ fftgrrev::fftgrrev(int arg): void fftgrrev::m_signal(int n, t_float * const *in, t_float *const *out) { - ins = in[0]; - outs = out[0]; - + t_sample * ins = in[0]; + t_sample * outs = out[0]; if (offset>0) { @@ -126,7 +122,7 @@ void fftgrrev::m_signal(int n, t_float * const *in, t_float *const *out) //grains - counter=1; + int counter=1; while (counter!=grains) { @@ -144,7 +140,6 @@ void fftgrrev::set_offset(t_int o) if (o-bs<0 && o+bs>0) { offset=-o; - post("offset %i",o); } else post("Offset out of range!"); -- cgit v1.2.1