From 478eeca99ee6f5bad3063700fbcc9d8913c770ae Mon Sep 17 00:00:00 2001 From: Thomas Grill Date: Fri, 17 Jan 2003 04:37:14 +0000 Subject: "" svn path=/trunk/; revision=342 --- externals/grill/fftease/build-pd-bcc.bat | 3 - externals/grill/fftease/config-pd-bcc.txt | 29 ------- externals/grill/fftease/fftease.dsp | 20 +++++ externals/grill/fftease/make-files.txt | 3 +- externals/grill/fftease/makefile.pd-bcc | 81 ------------------- externals/grill/fftease/makefile.pd-msvc | 12 ++- externals/grill/fftease/readme.txt | 9 ++- externals/grill/fftease/src/fftease.cpp | 14 +++- externals/grill/fftease/src/main.cpp | 25 +++--- externals/grill/fftease/src/main.h | 2 + externals/grill/fftease/src/scrape~.cpp | 38 ++++----- externals/grill/fftease/src/shapee~.cpp | 2 +- externals/grill/fftease/src/swinger~.cpp | 62 +++++++++++++++ externals/grill/fftease/src/taint~.cpp | 97 +++++++++++++++++++++++ externals/grill/fftease/src/thresher~.cpp | 125 ++++++++++++++++++++++++++++++ externals/grill/fftease/src/vacancy~.cpp | 125 ++++++++++++++++++++++++++++++ externals/grill/fftease/src/xsyn~.cpp | 52 +++++++++++++ 17 files changed, 541 insertions(+), 158 deletions(-) delete mode 100644 externals/grill/fftease/build-pd-bcc.bat delete mode 100644 externals/grill/fftease/config-pd-bcc.txt delete mode 100644 externals/grill/fftease/makefile.pd-bcc create mode 100644 externals/grill/fftease/src/swinger~.cpp create mode 100644 externals/grill/fftease/src/taint~.cpp create mode 100644 externals/grill/fftease/src/thresher~.cpp create mode 100644 externals/grill/fftease/src/vacancy~.cpp create mode 100644 externals/grill/fftease/src/xsyn~.cpp (limited to 'externals/grill') diff --git a/externals/grill/fftease/build-pd-bcc.bat b/externals/grill/fftease/build-pd-bcc.bat deleted file mode 100644 index 3dd21329..00000000 --- a/externals/grill/fftease/build-pd-bcc.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo --- Building with BorlandC++ --- - -make -f makefile.pd-bcc diff --git a/externals/grill/fftease/config-pd-bcc.txt b/externals/grill/fftease/config-pd-bcc.txt deleted file mode 100644 index 4edcdf8d..00000000 --- a/externals/grill/fftease/config-pd-bcc.txt +++ /dev/null @@ -1,29 +0,0 @@ -# FFTease - A set of Live Spectral Processors -# Originally written by Eric Lyon and Christopher Penrose for the Max/MSP platform -# -# This flext port is based on the jMax port of Christian Klippel -# -# Copyright (c)Thomas Grill (xovo@gmx.net) -# For information on usage and redistribution, and for a DISCLAIMER OF ALL -# WARRANTIES, see the file, "license.txt," in this distribution. -# - -# where is PD? -PDPATH=c:\programme\audio\pd - -# where do the flext libraries reside? -FLEXTPATH=$(PDPATH)\flext - -# where is BorlandC++? -BCCPATH=c:\programme\prog\bcc55 - - -# where should the external(s) be built? -OUTPATH=.\pd-bcc - -# should the external be installed? (yes/no) -INSTALL=yes - -# where should the external be installed? -INSTDIR=$(PDPATH)\extra - diff --git a/externals/grill/fftease/fftease.dsp b/externals/grill/fftease/fftease.dsp index 413523ef..650e35ff 100644 --- a/externals/grill/fftease/fftease.dsp +++ b/externals/grill/fftease/fftease.dsp @@ -174,6 +174,26 @@ SOURCE=.\src\scrape~.cpp SOURCE=.\src\shapee~.cpp # End Source File +# Begin Source File + +SOURCE=.\src\swinger~.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\taint~.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\thresher~.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\vacancy~.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\xsyn~.cpp +# End Source File # End Group # Begin Group "doc" diff --git a/externals/grill/fftease/make-files.txt b/externals/grill/fftease/make-files.txt index 418cd275..004b9b06 100644 --- a/externals/grill/fftease/make-files.txt +++ b/externals/grill/fftease/make-files.txt @@ -4,7 +4,8 @@ SRCS= \ leanconvert.c leanunconvert.c makewindows.c overlapadd.c unconvert.c \ main.cpp fftease.cpp \ burrow~.cpp cross~.cpp dentist~.cpp disarray~.cpp drown~.cpp ether~.cpp \ - morphine~.cpp scrape~.cpp shapee~.cpp + morphine~.cpp scrape~.cpp shapee~.cpp swinger~.cpp taint~.cpp \ + thresher~.cpp vacancy~.cpp xsyn~.cpp HDRS= \ pv.h main.h diff --git a/externals/grill/fftease/makefile.pd-bcc b/externals/grill/fftease/makefile.pd-bcc deleted file mode 100644 index 87d0185c..00000000 --- a/externals/grill/fftease/makefile.pd-bcc +++ /dev/null @@ -1,81 +0,0 @@ -# FFTease - A set of Live Spectral Processors -# Originally written by Eric Lyon and Christopher Penrose for the Max/MSP platform -# -# This flext port is based on the jMax port of Christian Klippel -# -# Copyright (c)Thomas Grill (xovo@gmx.net) -# For information on usage and redistribution, and for a DISCLAIMER OF ALL -# WARRANTIES, see the file, "license.txt," in this distribution. -# -# -# Makefile for BorlandC++ -# -# usage: make -f makefile.pd-bcc -# -# --------------------------------------------- - -!include config-pd-bcc.txt - -NAME=fftease -SETUPFUNCTION=$(NAME)_setup - -# flext stuff -TARGET=pdwin - -# includes, libs -INCPATH=-I$(BCCPATH)\include -I$(PDPATH)\src -I$(FLEXTPATH) -LIBPATH=-L$(BCCPATH)\lib -L$(PDPATH)\lib -LIBS=cw32.lib import32.lib C0D32.OBJ - -# compiler definitions and flags -DEFS=-DPD -CFLAGS=-6 -O2 -OS -ff -tWD - - -# the rest can stay untouched -# ---------------------------------------------- - -# all the source files from the package -!include make-files.txt - -# default target -all: $(OUTPATH)\$(NAME).dll - -# remove build -clean: - -del /s /q $(OUTPATH) > nul - rmdir $(OUTPATH) - - -install: - cp $(OUTPATH)\$(NAME).dll $(INSTDIR) - -# ---------------------------------------------- - -OBJS= $(SRCS:.cpp=.obj) - -#.PATH.OBJ=$(OUTPATH) - -#$(SRCS): $(HDRS) -# -touch $< - -{source}.cpp.obj: - bcc32 -c $(CFLAGS) $(DEFS) $(INCPATH) -n$(OUTPATH) $< - -$(OUTPATH): - -@if not exist $< mkdir $< - -$(OUTPATH)\pd.lib: $(PDPATH)\bin\pd.dll - implib -a $< $** - -$(OUTPATH)\$(NAME).def: - @echo EXPORTS $(SETUPFUNCTION) = _$(SETUPFUNCTION) > $< - -$(OUTPATH)\$(NAME).dll :: $(OUTPATH) $(OUTPATH)\$(NAME).def $(OUTPATH)\pd.lib - -$(OUTPATH)\$(NAME).dll :: $(OBJS) - cd $(OUTPATH) - ilink32 -C -Tpd $(LIBPATH) $** ,..\$<,,$(LIBS) pd.lib $(FLEXTPATH)\flext-$(TARGET).lib ,$(NAME).def - cd .. - - \ No newline at end of file diff --git a/externals/grill/fftease/makefile.pd-msvc b/externals/grill/fftease/makefile.pd-msvc index 6345e7db..45611f13 100644 --- a/externals/grill/fftease/makefile.pd-msvc +++ b/externals/grill/fftease/makefile.pd-msvc @@ -19,7 +19,7 @@ # includes INCPATH=/I"$(MSVCPATH)\include" /I"$(PDPATH)\src" /I"$(FLEXTPATH)" LIBPATH=/LIBPATH:"$(MSVCPATH)\lib" /LIBPATH:"$(PDPATH)\bin" /LIBPATH:"$(FLEXTPATH)" -LIBS=pd.lib flext_t-pdwin.lib +LIBS=pd.lib flext-pdwin.lib # compiler definitions and flags DEFS=/DPD @@ -44,13 +44,19 @@ clean: -del /q $(OUTPATH) > nul -rmdir $(OUTPATH) > nul -OBJS= $(SRCS:.cpp=.obj) +OBJS= $(SRCS:.c=.obj) +OBJS= $(OBJS:.objpp=.obj) + $(OUTPATH): -mkdir $(OUTPATH) > nul {$(DIR)}.cpp{}.obj: - cl /c /LD $(CFLAGS) $(DEFS) $(INCPATH) $** /Fo$(OUTPATH)\$@ + cl /c /LD $(CFLAGS) $(DEFS) $(INCPATH) $** /Fo$(OUTPATH)/$@ + +{$(DIR)}.c{}.obj: + cl /c /LD $(CFLAGS) $(DEFS) $(INCPATH) $** /Fo$(OUTPATH)/$@ + $(OUTPATH)\$(NAME).dll: $(OBJS) cd $(OUTPATH) diff --git a/externals/grill/fftease/readme.txt b/externals/grill/fftease/readme.txt index fd701cce..b00adbdc 100644 --- a/externals/grill/fftease/readme.txt +++ b/externals/grill/fftease/readme.txt @@ -16,8 +16,6 @@ pd - Windows: ------------- OK o Microsoft Visual C++ 6: edit "config-pd-msvc.txt" & run "build-pd-msvc.bat" -o Borland C++ 5.5 (free): edit "config-pd-bcc.txt" & run "build-pd-bcc.bat" - o Cygwin: edit "config-pd-cygwin.txt" & run "sh build-pd-cygwin.sh" additional settings (e.g. target processor, compiler flags) can be made in makefile.pd-cygwin @@ -77,3 +75,10 @@ PORTING NOTES: - ether: - possibility to change qual? +- scrape: + - maxamp is computed (from spectral amplitudes) before this is initialized!! -> corrected + +- swinger: + - phase is calculated from signal1 (instead of correct signal 2)!! (jMax version) + +- \ No newline at end of file diff --git a/externals/grill/fftease/src/fftease.cpp b/externals/grill/fftease/src/fftease.cpp index d29ecf27..4944e839 100644 --- a/externals/grill/fftease/src/fftease.cpp +++ b/externals/grill/fftease/src/fftease.cpp @@ -22,9 +22,8 @@ fftease::~fftease() {} BL fftease::Init() { - BL ret = flext_dsp::Init(); Clear(); - return ret; + return flext_dsp::Init(); } V fftease::Exit() @@ -71,6 +70,13 @@ V fftease::m_signal(I n,S *const *in,S *const *out) _input1[i] = in[0][j]; } + _rms = 0.; + if(_flags&F_RMS) { + for ( i=0; i < _Nw; i++ ) + _rms += _input1[i] * _input1[i]; + _rms = sqrt(_rms / _Nw); + } + /* apply hamming window and fold our window buffer into the fft buffer */ fold( _input1, _Wanal, _Nw, _buffer1, _N, _inCount ); if(_flags&F_STEREO) fold( _input2, _Wanal, _Nw, _buffer2, _N, _inCount ); @@ -133,11 +139,11 @@ void fftease::Set() /* assign memory to the buffers */ _input1 = new F[_Nw]; _buffer1 = new F[_N]; - if(_flags&F_CONVERT) _channel1 = new F[_N+2]; + if(_flags&(F_CONVERT|F_CRES)) _channel1 = new F[_N+2]; if(_flags&F_STEREO) { _input2 = new F[_Nw]; _buffer2 = new F[_N]; - if(_flags&F_CONVERT) _channel2 = new F[_N+2]; + if(_flags&(F_CONVERT|F_CRES)) _channel2 = new F[_N+2]; } _output = new F[_Nw]; diff --git a/externals/grill/fftease/src/main.cpp b/externals/grill/fftease/src/main.cpp index 36a02533..5dfdbee2 100644 --- a/externals/grill/fftease/src/main.cpp +++ b/externals/grill/fftease/src/main.cpp @@ -16,13 +16,12 @@ WARRANTIES, see the file, "license.txt," in this distribution. V lib_setup() { post(""); - post("-------------------------------------------------------"); + post("-------------------------------------------------------------------"); post("FFTease - A set of Live Spectral Processors"); - post("Originally written by Eric Lyon and Christopher Penrose"); - post("for the MAX/MSP platform."); + post("Originally written by Eric Lyon and Christopher Penrose for MAX/MSP"); post(""); - post("flext port provided by Thomas Grill, (C)2003"); - post("-------------------------------------------------------"); + post("flext port (version " FFTEASE_VERSION ") provided by Thomas Grill, (C)2003"); + post("-------------------------------------------------------------------"); post(""); // call the objects' setup routines @@ -35,15 +34,15 @@ V lib_setup() FLEXT_DSP_SETUP(morphine); FLEXT_DSP_SETUP(scrape); FLEXT_DSP_SETUP(shapee); -/* - FLEXT_DSP_SETUP(pvcompand); - FLEXT_DSP_SETUP(pvoc); - FLEXT_DSP_SETUP(swinger); FLEXT_DSP_SETUP(taint); FLEXT_DSP_SETUP(thresher); FLEXT_DSP_SETUP(vacancy); FLEXT_DSP_SETUP(xsyn); +/* + FLEXT_DSP_SETUP(pvcompand); + FLEXT_DSP_SETUP(pvoc); + */ #if FLEXT_SYS == FLEXT_SYS_MAX @@ -53,6 +52,14 @@ V lib_setup() finder_addclass((C *)"FFTease",(C *)"disarray~"); finder_addclass((C *)"FFTease",(C *)"drown~"); finder_addclass((C *)"FFTease",(C *)"ether~"); + finder_addclass((C *)"FFTease",(C *)"morphine~"); + finder_addclass((C *)"FFTease",(C *)"scrape~"); + finder_addclass((C *)"FFTease",(C *)"shapee~"); + finder_addclass((C *)"FFTease",(C *)"swinger~"); + finder_addclass((C *)"FFTease",(C *)"taint~"); + finder_addclass((C *)"FFTease",(C *)"thresher~"); + finder_addclass((C *)"FFTease",(C *)"vacancy~"); + finder_addclass((C *)"FFTease",(C *)"xsyn~"); #endif } diff --git a/externals/grill/fftease/src/main.h b/externals/grill/fftease/src/main.h index 620cca5d..aeaea3e4 100644 --- a/externals/grill/fftease/src/main.h +++ b/externals/grill/fftease/src/main.h @@ -78,9 +78,11 @@ protected: F_WINDOW = 0x02, F_BITSHUFFLE = 0x04, F_CONVERT = 0x08,F_CRES = 0x10, + F_RMS = 0x20 }; I _mult,_flags; + F _rms; private: I blsz; diff --git a/externals/grill/fftease/src/scrape~.cpp b/externals/grill/fftease/src/scrape~.cpp index 6d63ed6b..9aa0245f 100644 --- a/externals/grill/fftease/src/scrape~.cpp +++ b/externals/grill/fftease/src/scrape~.cpp @@ -37,8 +37,8 @@ private: static V setup(t_classid c); - V ms_knee(F knee) { _knee = knee; UpdThrFun(); } - V ms_cutoff(F cutoff) { _cutoff = cutoff; UpdThrFun(); } + inline V ms_knee(F knee) { _knee = knee; UpdThrFun(); } + inline V ms_cutoff(F cutoff) { _cutoff = cutoff; UpdThrFun(); } FLEXT_ATTRGET_F(_knee) FLEXT_CALLSET_F(ms_knee) @@ -57,7 +57,7 @@ V scrape::setup(t_classid c) scrape::scrape(I argc,const t_atom *argv): - fftease(4,F_WINDOW|F_BITSHUFFLE|F_CRES), + fftease(4,F_WINDOW|F_BITSHUFFLE|F_CONVERT), _thresh1(.0001),_thresh2(.09), _knee(1000),_cutoff(4000) @@ -116,7 +116,7 @@ V scrape::UpdThrFun() if( curfreq < _knee ) _threshfunc[i] = 0; else if( curfreq >= _knee && curfreq < _cutoff ) { - F m = (_knee - curfreq) / (_cutoff - _knee) ; + const F m = (_knee - curfreq) / (_cutoff - _knee) ; _threshfunc[i] = (1-m) * _thresh1 + m * _thresh2 ; } else _threshfunc[i] = _thresh2; @@ -125,34 +125,22 @@ V scrape::UpdThrFun() } } +/*! \brief Do the spectral transformation + \remark maxamp is calculated later than in the original FFTease scrape~ object +*/ V scrape::Transform(I _N2,S *const *in) { const F fmult = *in[0]; I i; F maxamp = 1.; + for( i = 0; i <= _N2; i++ ) + if(maxamp < _channel1[i*2]) + maxamp = _channel1[i*2]; - for( i = 0; i <= _N2; i++ ) { - const I amp = i*2; - if( maxamp < _channel1[amp] ) maxamp = _channel1[amp]; - } - - for ( i = 0; i <= _N2; i++ ) { - const I real = i*2,imag = real+1; - - F a = ( i == _N2 ? _buffer1[1] : _buffer1[real] ); - F b = ( i == 0 || i == _N2 ? 0. : _buffer1[imag] ); - - _channel1[real] = hypot( a, b ); - if ( _channel1[real] < _threshfunc[i] * maxamp ) _channel1[real] *= fmult; - _channel1[imag] = -atan2( b, a ); - } - - for ( i = 0; i <= _N2; i++ ) { - const I real = i*2, imag = real+1; - _buffer1[real] = _channel1[real] * cos( _channel1[imag] ); - if( i != _N2 ) _buffer1[imag] = -_channel1[real] * sin( _channel1[imag] ); - } + for( i = 0; i <= _N2; i++ ) + if(_channel1[i*2] < _threshfunc[i] * maxamp) + _channel1[i*2] *= fmult; } diff --git a/externals/grill/fftease/src/shapee~.cpp b/externals/grill/fftease/src/shapee~.cpp index 2fa0268c..e6c0f3f7 100644 --- a/externals/grill/fftease/src/shapee~.cpp +++ b/externals/grill/fftease/src/shapee~.cpp @@ -57,7 +57,7 @@ V shapee::Transform(I _N2,S *const *in) { // lets just shape the entire signal in groups of three - const _N = _N2*2; + const I _N = _N2*2; I i; for ( i=2; i < _N+2; i += 6 ) { F lowerMult = _channel1[i-2] / _channel1[i]; diff --git a/externals/grill/fftease/src/swinger~.cpp b/externals/grill/fftease/src/swinger~.cpp new file mode 100644 index 00000000..39fbd9a1 --- /dev/null +++ b/externals/grill/fftease/src/swinger~.cpp @@ -0,0 +1,62 @@ +/* + +FFTease - A set of Live Spectral Processors +Originally written by Eric Lyon and Christopher Penrose for the Max/MSP platform + +Copyright (c)Thomas Grill (xovo@gmx.net) +For information on usage and redistribution, and for a DISCLAIMER OF ALL +WARRANTIES, see the file, "license.txt," in this distribution. + +*/ + +#include "main.h" +#include + + +// add quality switch + +class swinger: + public fftease +{ + FLEXT_HEADER(swinger,fftease) + +public: + swinger(); + +protected: + + virtual V Transform(I n,S *const *in); +}; + +FLEXT_LIB_DSP("fftease, swinger~",swinger) + + +swinger::swinger(): + fftease(2,F_STEREO|F_BITSHUFFLE) +{ + AddInSignal("Messages and input signal"); + AddInSignal("Signal to supply phase information"); + AddOutSignal("Transformed signal"); +} + + +V swinger::Transform(I _N2,S *const *in) +{ + for (I i = 0; i <= _N2; i++ ) { + const I even = i*2,odd = even+1; + + // convert to polar coordinates from complex values + // replace signal one's phases with those of signal two + const F a1 = ( i == _N2 ? _buffer1[1] : _buffer1[even] ); + const F b1 = ( i == 0 || i == _N2 ? 0. : _buffer1[odd] ); + const F amp = hypot( a1, b1 ); + + const F a2 = ( i == _N2 ? _buffer2[1] : _buffer2[even] ); + const F b2 = ( i == 0 || i == _N2 ? 0. : _buffer2[odd] ); + const F ph = -atan2( b2, a2 ); + + _buffer1[even] = amp * cos( ph ); + if ( i != _N2 ) + _buffer1[odd] = -amp * sin( ph ); + } +} diff --git a/externals/grill/fftease/src/taint~.cpp b/externals/grill/fftease/src/taint~.cpp new file mode 100644 index 00000000..675ced1a --- /dev/null +++ b/externals/grill/fftease/src/taint~.cpp @@ -0,0 +1,97 @@ +/* + +FFTease - A set of Live Spectral Processors +Originally written by Eric Lyon and Christopher Penrose for the Max/MSP platform + +Copyright (c)Thomas Grill (xovo@gmx.net) +For information on usage and redistribution, and for a DISCLAIMER OF ALL +WARRANTIES, see the file, "license.txt," in this distribution. + +*/ + +#include "main.h" +#include + +class taint: + public fftease +{ + FLEXT_HEADER_S(taint,fftease,setup) + +public: + taint(I argc,const t_atom *argv); + +protected: + + virtual V Transform(I n,S *const *in); + + V ms_thresh(F thr) { _threshold = (F)pow(10.,(_threshdB = thr)*.05); } + + F _threshold,_threshdB; + BL _invert; + +private: + static V setup(t_classid c); + + FLEXT_ATTRGET_F(_threshdB) + FLEXT_CALLSET_F(ms_thresh) + FLEXT_ATTRVAR_B(_invert) +}; + +FLEXT_LIB_DSP_V("fftease, taint~",taint) + + +V taint::setup(t_classid c) +{ + FLEXT_CADDATTR_VAR(c,"threshold",_threshdB,ms_thresh); + FLEXT_CADDATTR_VAR1(c,"invert",_invert); +} + + +taint::taint(I argc,const t_atom *argv): + fftease(4,F_STEREO|F_WINDOW|F_BITSHUFFLE|F_CONVERT), + _threshdB(-10),_invert(false) +{ + /* parse and set object's options given */ + if(argc >= 1) { + if(CanbeFloat(argv[0])) + _threshdB = GetAFloat(argv[0]); + else + post("%s - Threshold must be a float value - set to %f",thisName(),_threshdB); + } + + if(argc >= 2) { + if(CanbeBool(argv[1])) + _invert = GetABool(argv[1]); + else + post("%s - Invert must be a boolean value - set to %0i",thisName(),_invert?1:0); + } + + ms_thresh(_threshdB); + + AddInSignal("Messages and frequency reference signal"); + AddInSignal("Amplitude reference signal"); + AddOutSignal("Transformed signal"); +} + + +V taint::Transform(I _N2,S *const *in) +{ + for (I i = 0; i <= _N2; i++ ) { + const I even = i*2, odd = even + 1; + + const F magnitude = _channel2[even]; + + if(_invert) { + // use threshold for inverse filtering to avoid division by zero + if ( magnitude < _threshold ) + _channel1[even] = 0; + else + _channel1[even] /= magnitude; + } + else { + // simple multiplication of magnitudes + if (magnitude > _threshold) + _channel1[even] *= magnitude; + } + } +} diff --git a/externals/grill/fftease/src/thresher~.cpp b/externals/grill/fftease/src/thresher~.cpp new file mode 100644 index 00000000..6be2389b --- /dev/null +++ b/externals/grill/fftease/src/thresher~.cpp @@ -0,0 +1,125 @@ +/* + +FFTease - A set of Live Spectral Processors +Originally written by Eric Lyon and Christopher Penrose for the Max/MSP platform + +Copyright (c)Thomas Grill (xovo@gmx.net) +For information on usage and redistribution, and for a DISCLAIMER OF ALL +WARRANTIES, see the file, "license.txt," in this distribution. + +*/ + +#include "main.h" +#include + +class thresher: + public fftease +{ + FLEXT_HEADER_S(thresher,fftease,setup) + +public: + thresher(); + +protected: + virtual V Set(); + virtual V Clear(); + virtual V Delete(); + + virtual V Transform(I n,S *const *in); + + F *_compositeFrame; + I *_framesLeft; + F *_c_lastphase_in,*_c_lastphase_out; + F _c_fundamental,_c_factor_in,_c_factor_out; + BL _firstFrame; + + F _moveThreshold; + I _maxHoldFrames; + +private: + static V setup(t_classid c); +}; + +FLEXT_LIB_DSP("fftease, thresher~",thresher) + + +V thresher::setup(t_classid c) +{ +} + +void thresher::Set() +{ + fftease::Set(); + + const F _R = Samplerate(); + const I _D = Blocksize(),_N = _D*Mult(),_Nw = _N,_N2 = _N/2,_Nw2 = _Nw/2; + + _compositeFrame = new F[_N+2]; + _framesLeft = new I[_N+2]; + _c_lastphase_in = new F[_N2+1]; + _c_lastphase_out = new F[_N2+1]; + + _c_fundamental = _R/_N; + _c_factor_in = _R/(_D * 3.14159265358979*2); + _c_factor_out = 1./_c_factor_in; + + _firstFrame = true; + _moveThreshold = .00001 ; + F _maxHoldTime = 5.0 ; + _maxHoldFrames = (I)(_maxHoldTime *_R/_D); +} + +void thresher::Clear() +{ + fftease::Clear(); + _compositeFrame = NULL; + _framesLeft = NULL; + _c_lastphase_in = _c_lastphase_out = NULL; +} + +void thresher::Delete() +{ + fftease::Delete(); + if(_compositeFrame) delete[] _compositeFrame; + if(_framesLeft) delete[] _framesLeft; + if(_c_lastphase_in) delete[] _c_lastphase_in; + if(_c_lastphase_out) delete[] _c_lastphase_out; +} + + +thresher::thresher(): + fftease(4,F_WINDOW|F_BITSHUFFLE|F_CRES) +{ + AddInSignal("Messages and input signal"); + AddOutSignal("Transformed signal"); +} + + +V thresher::Transform(I _N2,S *const *in) +{ + const I _N = _N2*2; + + convert( _buffer1, _channel1, _N2, _c_lastphase_in, _c_fundamental, _c_factor_in ); + + if( _firstFrame ) { + for (I i = 0; i < _N+2; i++ ){ + _compositeFrame[i] = _channel1[i]; + _framesLeft[i] = _maxHoldFrames; + } + _firstFrame = false; + } + else { + for(I i = 0; i < _N+2; i += 2 ){ + if( (fabs( _compositeFrame[i] - _channel1[i] ) > _moveThreshold) || (_framesLeft[i] <= 0) ) { + _compositeFrame[i] = _channel1[i]; + _compositeFrame[i+1] = _channel1[i+1]; + _framesLeft[i] = _maxHoldFrames; + } + else { + _framesLeft[i]--; + } + } + } + + unconvert( _compositeFrame, _buffer1, _N2, _c_lastphase_out, _c_fundamental, _c_factor_out ); +} diff --git a/externals/grill/fftease/src/vacancy~.cpp b/externals/grill/fftease/src/vacancy~.cpp new file mode 100644 index 00000000..a6d0a852 --- /dev/null +++ b/externals/grill/fftease/src/vacancy~.cpp @@ -0,0 +1,125 @@ +/* + +FFTease - A set of Live Spectral Processors +Originally written by Eric Lyon and Christopher Penrose for the Max/MSP platform + +Copyright (c)Thomas Grill (xovo@gmx.net) +For information on usage and redistribution, and for a DISCLAIMER OF ALL +WARRANTIES, see the file, "license.txt," in this distribution. + +*/ + +#include "main.h" +#include + +class vacancy: + public fftease +{ + FLEXT_HEADER_S(vacancy,fftease,setup) + +public: + vacancy(I argc,const t_atom *argv); + +protected: + virtual V Transform(I n,S *const *in); + + V ms_thresh(F thr) { _threshold = (F)pow(10.,(_threshdB = thr)*.05); } + + F _threshold,_threshdB; + BL _invert,_useRms,_swapPhase; + +private: + static V setup(t_classid c); + + FLEXT_ATTRGET_F(_threshdB) + FLEXT_CALLSET_F(ms_thresh) + FLEXT_ATTRVAR_B(_invert) + FLEXT_ATTRVAR_B(_useRms) + FLEXT_ATTRVAR_B(_swapPhase) +}; + +FLEXT_LIB_DSP_V("fftease, vacancy~",vacancy) + + +V vacancy::setup(t_classid c) +{ + FLEXT_CADDATTR_VAR(c,"threshold",_threshdB,ms_thresh); + FLEXT_CADDATTR_VAR1(c,"invert",_invert); + FLEXT_CADDATTR_VAR1(c,"rms",_useRms); + FLEXT_CADDATTR_VAR1(c,"swapphase",_swapPhase); +} + + +vacancy::vacancy(I argc,const t_atom *argv): + fftease(2,F_BITSHUFFLE|F_CONVERT), + _threshdB(-30),_invert(false),_useRms(true),_swapPhase(false) +{ + /* parse and set object's options given */ + if(argc >= 1) { + if(CanbeFloat(argv[0])) + _threshdB = GetAFloat(argv[0]); + else + post("%s - Threshold must be a float value - set to %f",thisName(),_threshdB); + } + + if(argc >= 2) { + if(CanbeBool(argv[1])) + _invert = GetABool(argv[1]); + else + post("%s - Invert must be a boolean value - set to %0i",thisName(),_invert?1:0); + } + + if(argc >= 3) { + if(CanbeBool(argv[2])) + _useRms = GetABool(argv[2]); + else + post("%s - Rms flag must be a boolean value - set to %0i",thisName(),_useRms?1:0); + } + + if(argc >= 4) { + if(CanbeBool(argv[3])) + _swapPhase = GetABool(argv[3]); + else + post("%s - Swapphase flag must be a boolean value - set to %0i",thisName(),_swapPhase?1:0); + } + + ms_thresh(_threshdB); + + AddInSignal("Messages and input signal"); + AddInSignal("Reference signal"); + AddOutSignal("Transformed signal"); +} + + +V vacancy::Transform(I _N2,S *const *in) +{ + const F useme = _useRms?_rms * _threshold:_threshold; + + // composite here please + if (_invert) + if (_swapPhase) + for (I i=0; i < _N2; i+=2 ) + if ( _channel1[i] > useme && _channel2[i] < _channel1[i] ) { + _channel1[i] = _channel2[i]; + _channel1[i+1] = _channel2[i+1]; + } + else + for (I i=0; i < _N2; i+=2 ) + if ( _channel1[i] > useme && _channel2[i] < _channel1[i] ) { + _channel1[i] = _channel2[i]; + if ( _channel1[i+1] == 0. ) _channel1[i+1] = _channel2[i+1]; + } + else + if (_swapPhase) + for (I i=0; i < _N2; i+=2 ) + if ( _channel1[i] < useme && _channel2[i] > _channel1[i] ) { + _channel1[i] = _channel2[i]; + _channel1[i+1] = _channel2[i+1]; + } + else + for (I i=0; i < _N2; i+=2 ) + if ( _channel1[i] < useme && _channel2[i] > _channel1[i] ) { + _channel1[i] = _channel2[i]; + if ( _channel1[i+1] == 0. ) _channel1[i+1] = _channel2[i+1]; + } +} diff --git a/externals/grill/fftease/src/xsyn~.cpp b/externals/grill/fftease/src/xsyn~.cpp new file mode 100644 index 00000000..fdb1e736 --- /dev/null +++ b/externals/grill/fftease/src/xsyn~.cpp @@ -0,0 +1,52 @@ +/* + +FFTease - A set of Live Spectral Processors +Originally written by Eric Lyon and Christopher Penrose for the Max/MSP platform + +Copyright (c)Thomas Grill (xovo@gmx.net) +For information on usage and redistribution, and for a DISCLAIMER OF ALL +WARRANTIES, see the file, "license.txt," in this distribution. + +*/ + +#include "main.h" +#include + +class xsyn: + public fftease +{ + FLEXT_HEADER(xsyn,fftease) + +public: + xsyn(); + +protected: + virtual V Transform(I n,S *const *in); +}; + +FLEXT_LIB_DSP("fftease, xsyn~",xsyn) + + +xsyn::xsyn(): + fftease(2,F_STEREO|F_BITSHUFFLE|F_CONVERT) +{ + AddInSignal("Messages and Source signal 1"); + AddInSignal("Source signal 2"); + AddOutSignal("Transformed signal"); +} + + +V xsyn::Transform(I _N2,S *const *in) +{ + const I _N = _N2*2; + + F maxamp = 0; + I i; + for( i = 0; i < _N; i+= 2 ) + if(_channel2[i] > maxamp ) maxamp = _channel2[i]; + + const F f = maxamp?1./maxamp:1.; + + for( i = 0; i < _N; i+= 2 ) + _channel1[i] *= (_channel2[i] * f); +} -- cgit v1.2.1