From 900871454af06db1d751e28cea56f59dc43d3c17 Mon Sep 17 00:00:00 2001 From: Thomas Grill Date: Wed, 8 Jan 2003 04:37:20 +0000 Subject: "" svn path=/trunk/; revision=328 --- externals/grill/fftease/build-pd-bcc.bat | 3 + externals/grill/fftease/build-pd-darwin.sh | 11 ++ externals/grill/fftease/build-pd-linux.sh | 11 ++ externals/grill/fftease/build-pd-msvc.bat | 4 + externals/grill/fftease/config-pd-bcc.txt | 29 +++ externals/grill/fftease/config-pd-darwin.txt | 32 +++ externals/grill/fftease/config-pd-linux.txt | 31 +++ externals/grill/fftease/config-pd-msvc.txt | 27 +++ externals/grill/fftease/fftease.dsp | 275 ++++++++++++++------------ externals/grill/fftease/make-files.txt | 10 + externals/grill/fftease/makefile.pd-bcc | 81 ++++++++ externals/grill/fftease/makefile.pd-darwin | 77 ++++++++ externals/grill/fftease/makefile.pd-linux | 82 ++++++++ externals/grill/fftease/makefile.pd-msvc | 64 ++++++ externals/grill/fftease/readme.txt | 17 ++ externals/grill/fftease/src/burrow~.cpp | 125 ++++++------ externals/grill/fftease/src/cross~.cpp | 236 ++++++++++++++++++++++ externals/grill/fftease/src/dentist~.cpp | 272 +++++++++++++++++++++++++ externals/grill/fftease/src/disarray~.cpp | 286 +++++++++++++++++++++++++++ externals/grill/fftease/src/drown~.cpp | 227 +++++++++++++++++++++ externals/grill/fftease/src/ether~.cpp | 251 +++++++++++++++++++++++ externals/grill/fftease/src/main.cpp | 15 +- externals/grill/fftease/src/main.h | 4 +- 23 files changed, 1973 insertions(+), 197 deletions(-) create mode 100644 externals/grill/fftease/build-pd-bcc.bat create mode 100644 externals/grill/fftease/build-pd-darwin.sh create mode 100644 externals/grill/fftease/build-pd-linux.sh create mode 100644 externals/grill/fftease/build-pd-msvc.bat create mode 100644 externals/grill/fftease/config-pd-bcc.txt create mode 100644 externals/grill/fftease/config-pd-darwin.txt create mode 100644 externals/grill/fftease/config-pd-linux.txt create mode 100644 externals/grill/fftease/config-pd-msvc.txt create mode 100644 externals/grill/fftease/make-files.txt create mode 100644 externals/grill/fftease/makefile.pd-bcc create mode 100644 externals/grill/fftease/makefile.pd-darwin create mode 100644 externals/grill/fftease/makefile.pd-linux create mode 100644 externals/grill/fftease/makefile.pd-msvc create mode 100644 externals/grill/fftease/src/cross~.cpp create mode 100644 externals/grill/fftease/src/dentist~.cpp create mode 100644 externals/grill/fftease/src/disarray~.cpp create mode 100644 externals/grill/fftease/src/drown~.cpp create mode 100644 externals/grill/fftease/src/ether~.cpp (limited to 'externals/grill/fftease') diff --git a/externals/grill/fftease/build-pd-bcc.bat b/externals/grill/fftease/build-pd-bcc.bat new file mode 100644 index 00000000..3dd21329 --- /dev/null +++ b/externals/grill/fftease/build-pd-bcc.bat @@ -0,0 +1,3 @@ +@echo --- Building with BorlandC++ --- + +make -f makefile.pd-bcc diff --git a/externals/grill/fftease/build-pd-darwin.sh b/externals/grill/fftease/build-pd-darwin.sh new file mode 100644 index 00000000..edd03207 --- /dev/null +++ b/externals/grill/fftease/build-pd-darwin.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +. config-pd-darwin.txt + +make -f makefile.pd-darwin && +{ + if [ $INSTPATH != "" ]; then + echo Now install as root + sudo make -f makefile.pd-darwin install + fi +} diff --git a/externals/grill/fftease/build-pd-linux.sh b/externals/grill/fftease/build-pd-linux.sh new file mode 100644 index 00000000..421cb6e1 --- /dev/null +++ b/externals/grill/fftease/build-pd-linux.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +. config-pd-linux.txt + +make -f makefile.pd-linux && +{ + if [ ${INSTPATH} != "" ]; then + echo Now install as root + su -c "make -f makefile.pd-linux install" + fi +} diff --git a/externals/grill/fftease/build-pd-msvc.bat b/externals/grill/fftease/build-pd-msvc.bat new file mode 100644 index 00000000..d6187f08 --- /dev/null +++ b/externals/grill/fftease/build-pd-msvc.bat @@ -0,0 +1,4 @@ +@echo --- Building with MS Visual C++ --- + +nmake -f makefile.pd-msvc clean +nmake -f makefile.pd-msvc diff --git a/externals/grill/fftease/config-pd-bcc.txt b/externals/grill/fftease/config-pd-bcc.txt new file mode 100644 index 00000000..4edcdf8d --- /dev/null +++ b/externals/grill/fftease/config-pd-bcc.txt @@ -0,0 +1,29 @@ +# 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/config-pd-darwin.txt b/externals/grill/fftease/config-pd-darwin.txt new file mode 100644 index 00000000..a58d7008 --- /dev/null +++ b/externals/grill/fftease/config-pd-darwin.txt @@ -0,0 +1,32 @@ +# 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. +# + +# your c++ compiler (define only if not g++) +# CXX=g++ + +# where are the PD header files? +# leave it blank if it is a system directory (like /usr/local/include), +# since gcc 3.2 complains about it +PDPATH=/usr/local/pd/src + +# where is the PD executable? +PD=/usr/local/pd/bin/pd + +# where do the flext libraries reside? +FLEXTPATH=/usr/local/pd/flext + + +# where should flext libraries be built? +TARGDIR=./pd-darwin +# where should the external be installed? +# (leave blank to omit installation) +INSTPATH=/usr/local/pd/extra + + diff --git a/externals/grill/fftease/config-pd-linux.txt b/externals/grill/fftease/config-pd-linux.txt new file mode 100644 index 00000000..bbbf8da2 --- /dev/null +++ b/externals/grill/fftease/config-pd-linux.txt @@ -0,0 +1,31 @@ +# 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. +# + + +# your c++ compiler (define only if not g++) +# CXX=g++ + +# where are the PD header files? +# leave it blank if it is a system directory (like /usr/local/include), +# since gcc 3.2 complains about it +PDPATH= + +# where do the flext libraries reside? +FLEXTPATH=/usr/local/lib/pd/flext + +# where should flext libraries be built? +TARGDIR=./pd-linux + +# where should the external be installed? +# (leave blank to omit installation) +INSTPATH=/usr/local/lib/pd/extra + + + diff --git a/externals/grill/fftease/config-pd-msvc.txt b/externals/grill/fftease/config-pd-msvc.txt new file mode 100644 index 00000000..a4e0015a --- /dev/null +++ b/externals/grill/fftease/config-pd-msvc.txt @@ -0,0 +1,27 @@ +# 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 MS VC++? +MSVCPATH=c:\programme\prog\microsoft visual studio\VC98 + + +# where should the external be built? +OUTPATH=pd-msvc + +# where should the external be installed? +# (leave blank to omit installation) +INSTDIR=$(PDPATH)\extra diff --git a/externals/grill/fftease/fftease.dsp b/externals/grill/fftease/fftease.dsp index 2b66b6d8..85b09613 100644 --- a/externals/grill/fftease/fftease.dsp +++ b/externals/grill/fftease/fftease.dsp @@ -142,6 +142,26 @@ SOURCE=.\src\unconvert.c SOURCE=.\src\burrow~.cpp # End Source File +# Begin Source File + +SOURCE=.\src\cross~.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\dentist~.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\disarray~.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\drown~.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\ether~.cpp +# End Source File # End Group # Begin Group "doc" @@ -159,229 +179,232 @@ SOURCE=.\license.txt SOURCE=.\readme.txt # End Source File # End Group -# Begin Group "Ori" +# Begin Group "ori.jmax" # PROP Default_Filter "" # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\burrow~.c - -!IF "$(CFG)" == "fftease - Win32 Release" - -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" - +SOURCE=.\ori.jmax\burrow~.c # PROP Exclude_From_Build 1 - -!ENDIF - # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\cross~.c - -!IF "$(CFG)" == "fftease - Win32 Release" - -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" - +SOURCE=.\ori.jmax\cross~.c # PROP Exclude_From_Build 1 - -!ENDIF - # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\dentist~.c - -!IF "$(CFG)" == "fftease - Win32 Release" - -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" - +SOURCE=.\ori.jmax\dentist~.c # PROP Exclude_From_Build 1 - -!ENDIF - # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\disarray~.c - -!IF "$(CFG)" == "fftease - Win32 Release" - -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" - +SOURCE=.\ori.jmax\disarray~.c # PROP Exclude_From_Build 1 - -!ENDIF - # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\drown~.c - -!IF "$(CFG)" == "fftease - Win32 Release" - -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" - +SOURCE=.\ori.jmax\drown~.c # PROP Exclude_From_Build 1 - -!ENDIF - # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\ether~.c - -!IF "$(CFG)" == "fftease - Win32 Release" - -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" - +SOURCE=.\ori.jmax\ether~.c # PROP Exclude_From_Build 1 - -!ENDIF - # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\morphine~.c - -!IF "$(CFG)" == "fftease - Win32 Release" - -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" - +SOURCE=.\ori.jmax\FFTease.c # PROP Exclude_From_Build 1 - -!ENDIF - # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\pvcompand~.c - -!IF "$(CFG)" == "fftease - Win32 Release" - -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" - +SOURCE=.\ori.jmax\morphine~.c # PROP Exclude_From_Build 1 - -!ENDIF - # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\pvoc~.c - -!IF "$(CFG)" == "fftease - Win32 Release" - -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" - +SOURCE=.\ori.jmax\pvcompand~.c # PROP Exclude_From_Build 1 - -!ENDIF - # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\scrape~.c - -!IF "$(CFG)" == "fftease - Win32 Release" - -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" - +SOURCE=.\ori.jmax\pvoc~.c # PROP Exclude_From_Build 1 - -!ENDIF - # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\shapee~.c - -!IF "$(CFG)" == "fftease - Win32 Release" - -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" - +SOURCE=.\ori.jmax\scrape~.c # PROP Exclude_From_Build 1 - -!ENDIF - # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\swinger~.c - -!IF "$(CFG)" == "fftease - Win32 Release" +SOURCE=.\ori.jmax\shapee~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" +SOURCE=.\ori.jmax\swinger~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File +SOURCE=.\ori.jmax\taint~.c # PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!ENDIF +SOURCE=.\ori.jmax\thresher~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File +SOURCE=.\ori.jmax\unconvert.c +# PROP Exclude_From_Build 1 # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\taint~.c +SOURCE=.\ori.jmax\vacancy~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!IF "$(CFG)" == "fftease - Win32 Release" +SOURCE=.\ori.jmax\xsyn~.c +# PROP Exclude_From_Build 1 +# End Source File +# End Group +# Begin Group "ori.maxmsp" -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" +# PROP Default_Filter "" +# Begin Source File +SOURCE=.\ori.max\burrow~.c # PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!ENDIF - +SOURCE=".\ori.max\cross-opt~.c" +# PROP Exclude_From_Build 1 # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\thresher~.c +SOURCE=.\ori.max\dentist~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!IF "$(CFG)" == "fftease - Win32 Release" +SOURCE=.\ori.max\denude~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" +SOURCE=.\ori.max\disarray~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File +SOURCE=.\ori.max\ether~.c # PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!ENDIF +SOURCE=.\ori.max\fxsyn~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File +SOURCE=.\ori.max\morphine~.c +# PROP Exclude_From_Build 1 # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\unconvert.c +SOURCE=.\ori.max\multyQ_opt~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!IF "$(CFG)" == "fftease - Win32 Release" +SOURCE=.\ori.max\nacho_opt~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" +SOURCE=.\ori.max\pvcompand_opt~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File +SOURCE=.\ori.max\pvcompand~.c # PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!ENDIF +SOURCE=.\ori.max\pvharm~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File +SOURCE=.\ori.max\pvoc_opt~.c +# PROP Exclude_From_Build 1 # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\vacancy~.c +SOURCE=.\ori.max\pvoc~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!IF "$(CFG)" == "fftease - Win32 Release" +SOURCE=.\ori.max\residency~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" +SOURCE=.\ori.max\scrape_opt~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File +SOURCE=.\ori.max\scrape~.c # PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!ENDIF +SOURCE=.\ori.max\shapee_opt~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File +SOURCE=.\ori.max\swinger_opt~.c +# PROP Exclude_From_Build 1 # End Source File # Begin Source File -SOURCE=..\..\packs\FFTease\c\src\xsyn~.c +SOURCE=.\ori.max\swinger~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!IF "$(CFG)" == "fftease - Win32 Release" +SOURCE=.\ori.max\taint~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!ELSEIF "$(CFG)" == "fftease - Win32 Debug" +SOURCE=.\ori.max\thresher_opt~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File +SOURCE=.\ori.max\thresher~.c # PROP Exclude_From_Build 1 +# End Source File +# Begin Source File -!ENDIF +SOURCE=.\ori.max\vacancy~.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File +SOURCE=".\ori.max\xsyn-opt~.c" +# PROP Exclude_From_Build 1 # End Source File # End Group # Begin Source File diff --git a/externals/grill/fftease/make-files.txt b/externals/grill/fftease/make-files.txt new file mode 100644 index 00000000..567427b4 --- /dev/null +++ b/externals/grill/fftease/make-files.txt @@ -0,0 +1,10 @@ +# all the source files from the package +SRCS= \ + convert.c convert_new.c fft4.c fft.c fold.c \ + leanconvert.c leanunconvert.c makewindows.c overlapadd.c unconvert.c \ + main.cpp \ + burrow~.cpp cross~.cpp dentist~.cpp disarray~.cpp drown~.cpp ether~.cpp + +HDRS= \ + pv.h main.h + diff --git a/externals/grill/fftease/makefile.pd-bcc b/externals/grill/fftease/makefile.pd-bcc new file mode 100644 index 00000000..87d0185c --- /dev/null +++ b/externals/grill/fftease/makefile.pd-bcc @@ -0,0 +1,81 @@ +# 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-darwin b/externals/grill/fftease/makefile.pd-darwin new file mode 100644 index 00000000..e175d277 --- /dev/null +++ b/externals/grill/fftease/makefile.pd-darwin @@ -0,0 +1,77 @@ +# 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 gcc @ darwin (OSX) +# +# usage: +# to build run "make -f makefile.pd-darwin" +# to install (as root), do "make -f makefile.pd-darwin install" +# + +CONFIG=config-pd-darwin.txt + +include ${CONFIG} + +FLEXTLIB=${FLEXTPATH}/flext.a + +# compiler+linker stuff +INCLUDES=${PDPATH} ${FLEXTPATH} +LIBPATH= +FLAGS=-DPD -Dunix -DMACOSX +CFLAGS=-O6 -Wno-unused -Wno-parentheses -Wno-switch -Wstrict-prototypes # -maltivec +#CFLAGS=-g +LIBS=m +LDFLAGS=-bundle -bundle_loader ${PD} + +# --------------------------------------------- +# the rest can stay untouched +# ---------------------------------------------- +NAME=fftease + +# all the source files from the package +include make-files.txt + +DIR=src + +TARGET=$(TARGDIR)/$(NAME).pd_darwin +MAKEFILE=makefile.pd-darwin + +# default target +all: $(TARGDIR) $(TARGET) + +$(patsubst %,$(DIR)/%,$(SRCS)): $(patsubst %,$(DIR)/%,$(HDRS)) $(FLEXTLIB) $(MAKEFILE) $(CONFIG) + touch $@ + +$(TARGDIR): + mkdir $(TARGDIR) + +$(TARGDIR)/%.o : $(DIR)/%.cpp + $(CXX) -c $(CFLAGS) $(FLAGS) $(patsubst %,-I%,$(INCLUDES)) $< -o $@ + +$(TARGET) : $(patsubst %.cpp,$(TARGDIR)/%.o,$(SRCS)) $(FLEXTLIB) + $(CXX) $(LDFLAGS) $^ $(patsubst %,-L%,$(LIBPATH)) $(patsubst %,-l%,$(LIBS)) -o $@ + chmod 755 $@ + +$(INSTPATH): + mkdir $(INSTPATH) + +install:: $(INSTPATH) + +install:: $(TARGET) + cp $^ $(INSTPATH) +# chown root.root $(patsubst %,$(INSTPATH)/%,$(notdir $^)) +# chmod 755 $(patsubst %,$(INSTPATH)/%,$(notdir $^)) + +.PHONY: clean + +clean: + rm -f $(TARGDIR)/*.o $(TARGET) + + diff --git a/externals/grill/fftease/makefile.pd-linux b/externals/grill/fftease/makefile.pd-linux new file mode 100644 index 00000000..cd9d8401 --- /dev/null +++ b/externals/grill/fftease/makefile.pd-linux @@ -0,0 +1,82 @@ +# 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 gcc @ linux +# +# usage: +# to build run "make -f makefile.pd-linux" +# to install (as root), do "make -f makefile.pd-linux install" +# + +CONFIG=config-pd-linux.txt + +include $(CONFIG) + +FLEXTLIB=$(FLEXTPATH)/flext.a + +# compiler+linker stuff +INCLUDES=$(PDPATH) +LIBPATH= +FLAGS=-DPD +CFLAGS=-O6 -mcpu=pentiumpro +#CFLAGS=-g +LIBS=m util + + +# --------------------------------------------- +# the rest can stay untouched +# ---------------------------------------------- + +NAME=fftease + +# all the source files from the package +include make-files.txt + +TARGET=$(TARGDIR)/$(NAME).pd_linux +DIR=src + +# default target +all: $(TARGDIR) $(TARGET) + +$(patsubst %,$(DIR)/%,$(SRCS)): $(patsubst %,$(DIR)/%,$(HDRS)) $(FLEXTLIB) $(CONFIG) + touch $@ + +$(TARGDIR): + mkdir $(TARGDIR) + +$(TARGDIR)/%.o : $(DIR)/%.cpp + $(CXX) -c $(CFLAGS) $(FLAGS) $(patsubst %,-I%,$(INCLUDES) $(FLEXTPATH)) $< -o $@ + +$(TARGET) : $(patsubst %.cpp,$(TARGDIR)/%.o,$(SRCS)) $(FLEXTLIB) + $(CXX) -shared $^ $(patsubst %,-L%,$(LIBPATH)) $(patsubst %,-l%,$(LIBS)) -o $@ + chmod 755 $@ + +$(INSTPATH): + mkdir $(INSTDIR) + +install:: $(INSTDIR) + +install:: $(TARGET) + cp $^ $(INSTPATH) + chown root.root $(patsubst %,$(INSTPATH)/%,$(notdir $^)) + chmod 755 $(patsubst %,$(INSTPATH)/%,$(notdir $^)) + +.PHONY: clean +clean: + rm -f $(TARGDIR)/*.o $(TARGET) + + + + + + + + + diff --git a/externals/grill/fftease/makefile.pd-msvc b/externals/grill/fftease/makefile.pd-msvc new file mode 100644 index 00000000..6345e7db --- /dev/null +++ b/externals/grill/fftease/makefile.pd-msvc @@ -0,0 +1,64 @@ +# 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 MSVC++ 6 +# +# usage: +# to build run "make -f makefile.pd-msvc" +# + +!include config-pd-msvc.txt + +# 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 + +# compiler definitions and flags +DEFS=/DPD + +CFLAGS=/GR- /GX- /GD /G6 /Ox + +# the rest can stay untouched +# ---------------------------------------------- + +# all the source files from the package +!include make-files.txt + +# ----------------------------------------------- + +NAME=fftease +DIR=src + +all: $(OUTPATH) $(OUTPATH)\$(NAME).dll + +# remove build +clean: + -del /q $(OUTPATH) > nul + -rmdir $(OUTPATH) > nul + +OBJS= $(SRCS:.cpp=.obj) + +$(OUTPATH): + -mkdir $(OUTPATH) > nul + +{$(DIR)}.cpp{}.obj: + cl /c /LD $(CFLAGS) $(DEFS) $(INCPATH) $** /Fo$(OUTPATH)\$@ + +$(OUTPATH)\$(NAME).dll: $(OBJS) + cd $(OUTPATH) + link /DLL /out:$(NAME).dll /INCREMENTAL:NO $** $(LIBS) $(LIBPATH) + @-del *.exp + @-del *.lib + cd .. +!ifdef INSTPATH + @-if not exist $(INSTPATH) mkdir $(INSTPATH) + copy $@ $(INSTPATH) > nul +!endif diff --git a/externals/grill/fftease/readme.txt b/externals/grill/fftease/readme.txt index 7507ee56..3f2bda5b 100644 --- a/externals/grill/fftease/readme.txt +++ b/externals/grill/fftease/readme.txt @@ -55,3 +55,20 @@ You must have the following "Source Trees" defined: "MP SDK" - Pointing to the Multiprocessing SDK (for threading support) +---------------------------------------------------------------------------- + +PORTING NOTES: + +- cross: + - what about the class members for "correction"?! (superfluous) + +- dentist: + - tooth count ("teeth") is preserved and checked on every reshuffle + - different knee correction + +- disarray: + - different frequency correction + +- ether: + - possibility to change qual? + diff --git a/externals/grill/fftease/src/burrow~.cpp b/externals/grill/fftease/src/burrow~.cpp index ffb6c90a..aef5e7aa 100644 --- a/externals/grill/fftease/src/burrow~.cpp +++ b/externals/grill/fftease/src/burrow~.cpp @@ -3,8 +3,6 @@ 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. @@ -30,22 +28,23 @@ protected: I blsz; BL _invert; - I _inCount; - I *_bitshuffle; F _threshold,_multiplier; F _thresh_dB,_mult_dB; - F *_Wanal; - F *_Wsyn; - F *_inputOne,*_inputTwo; - F *_Hwin; - F *_bufferOne,*_bufferTwo; - F *_channelOne,*_channelTwo; + F *_input1,*_input2; + F *_buffer1,*_buffer2; + F *_channel1,*_channel2; F *_output; F *_trigland; + I *_bitshuffle; + F *_Wanal,*_Wsyn,*_Hwin; + + I _inCount; private: + enum { _MULT_ = 4 }; + V Clear(); V Delete(); @@ -103,8 +102,8 @@ burrow::burrow(I argc,const t_atom *argv): Clear(); - AddInSignal("Commands and original signal"); - AddInSignal("Modulating signal"); + AddInSignal("Messages and input signal"); + AddInSignal("Reference signal"); AddOutSignal("Transformed signal"); } @@ -117,11 +116,11 @@ V burrow::Clear() { _bitshuffle = NULL; _trigland = NULL; - _inputOne = _inputTwo = NULL; + _input1 = _input2 = NULL; _Hwin = NULL; _Wanal = _Wsyn = NULL; - _bufferOne = _bufferTwo = NULL; - _channelOne = _channelTwo = NULL; + _buffer1 = _buffer2 = NULL; + _channel1 = _channel2 = NULL; _output = NULL; } @@ -129,15 +128,15 @@ V burrow::Delete() { if(_bitshuffle) delete[] _bitshuffle; if(_trigland) delete[] _trigland; - if(_inputOne) delete[] _inputOne; - if(_inputTwo) delete[] _inputTwo; + if(_input1) delete[] _input1; + if(_input2) delete[] _input2; if(_Hwin) delete[] _Hwin; if(_Wanal) delete[] _Wanal; if(_Wsyn) delete[] _Wsyn; - if(_bufferOne) delete[] _bufferOne; - if(_bufferTwo) delete[] _bufferTwo; - if(_channelOne) delete[] _channelOne; - if(_channelTwo) delete[] _channelTwo; + if(_buffer1) delete[] _buffer1; + if(_buffer2) delete[] _buffer2; + if(_channel1) delete[] _channel1; + if(_channel2) delete[] _channel2; if(_output) delete[] _output; } @@ -152,23 +151,25 @@ V burrow::m_dsp(I n,S *const *in,S *const *out) Delete(); /* preset the objects data */ - const I _N = _D*4,_Nw = _N,_N2 = _N/2,_Nw2 = _Nw/2; + const I _N = _D*_MULT_,_Nw = _N,_N2 = _N/2,_Nw2 = _Nw/2; _inCount = -_Nw; /* assign memory to the buffers */ + _input1 = new F[_Nw]; + _input2 = new F[_Nw]; + _buffer1 = new F[_N]; + _buffer2 = new F[_N]; + _channel1 = new F[_N+2]; + _channel2 = new F[_N+2]; + _output = new F[_Nw]; + _bitshuffle = new I[_N*2]; _trigland = new F[_N*2]; - _inputOne = new F[_Nw]; - _inputTwo = new F[_Nw]; + _Hwin = new F[_Nw]; _Wanal = new F[_Nw]; _Wsyn = new F[_Nw]; - _bufferOne = new F[_N]; - _bufferTwo = new F[_N]; - _channelOne = new F[_N+2]; - _channelTwo = new F[_N+2]; - _output = new F[_Nw]; /* initialize pv-lib functions */ init_rdft( _N, _bitshuffle, _trigland); @@ -178,75 +179,75 @@ V burrow::m_dsp(I n,S *const *in,S *const *out) V burrow::m_signal(I n,S *const *in,S *const *out) { - const S *inOne = in[0],*inTwo = in[1]; - S *outOne = out[0]; - /* declare working variables */ I i, j; - const I _D = blsz,_N = _D*4,_Nw = _N,_N2 = _N/2,_Nw2 = _Nw/2; + const I _D = blsz,_N = _D*_MULT_,_Nw = _N,_N2 = _N/2,_Nw2 = _Nw/2; /* fill our retaining buffers */ _inCount += _D; for(i = 0; i < _N-_D ; i++ ) { - _inputOne[i] = _inputOne[i+_D]; - _inputTwo[i] = _inputTwo[i+_D]; + _input1[i] = _input1[i+_D]; + _input2[i] = _input2[i+_D]; } for(j = 0; i < _N; i++,j++) { - _inputOne[i] = inOne[j]; - _inputTwo[i] = inTwo[j]; + _input1[i] = in[0][j]; + _input2[i] = in[1][j]; } /* apply hamming window and fold our window buffer into the fft buffer */ - fold( _inputOne, _Wanal, _Nw, _bufferOne, _N, _inCount ); - fold( _inputTwo, _Wanal, _Nw, _bufferTwo, _N, _inCount ); + fold( _input1, _Wanal, _Nw, _buffer1, _N, _inCount ); + fold( _input2, _Wanal, _Nw, _buffer2, _N, _inCount ); /* do an fft */ - rdft( _N, 1, _bufferOne, _bitshuffle, _trigland ); - rdft( _N, 1, _bufferTwo, _bitshuffle, _trigland ); + rdft( _N, 1, _buffer1, _bitshuffle, _trigland ); + rdft( _N, 1, _buffer2, _bitshuffle, _trigland ); + + // ---- BEGIN -------------------------------- - /* convert to polar coordinates from complex values */ for ( i = 0; i <= _N2; i++ ) { const I even = i<<1,odd = even+1; + + /* convert to polar coordinates from complex values */ register F a,b; - a = ( i == _N2 ? _bufferOne[1] : _bufferOne[even] ); - b = ( i == 0 || i == _N2 ? 0. : _bufferOne[odd] ); + a = ( i == _N2 ? _buffer1[1] : _buffer1[even] ); + b = ( i == 0 || i == _N2 ? 0. : _buffer1[odd] ); - _channelOne[even] = hypot( a, b ); - _channelOne[odd] = -atan2( b, a ); + _channel1[even] = hypot( a, b ); + _channel1[odd] = -atan2( b, a ); - a = ( i == _N2 ? _bufferTwo[1] : _bufferTwo[even] ); - b = ( i == 0 || i == _N2 ? 0. : _bufferTwo[odd] ); + a = ( i == _N2 ? _buffer2[1] : _buffer2[even] ); + b = ( i == 0 || i == _N2 ? 0. : _buffer2[odd] ); - _channelTwo[even] = hypot( a, b ); + _channel2[even] = hypot( a, b ); /* use simple threshold from second signal to trigger filtering */ - if (_invert?(_channelTwo[even] < _threshold):(_channelTwo[even] > _threshold) ) - _channelOne[even] *= _multiplier; - } - - /* convert back to complex form, read for the inverse fft */ - for ( i = 0; i <= _N2; i++ ) { - const I even = i<<1,odd = even+1; + if (_invert?(_channel2[even] < _threshold):(_channel2[even] > _threshold) ) + _channel1[even] *= _multiplier; - _bufferOne[even] = _channelOne[even] * cos( _channelOne[odd] ); + /* convert back to complex form, read for the inverse fft */ + _buffer1[even] = _channel1[even] * cos( _channel1[odd] ); if ( i != _N2 ) - _bufferOne[odd] = -_channelOne[even] * sin( _channelOne[odd] ); + _buffer1[odd] = -_channel1[even] * sin( _channel1[odd] ); } + + // ---- END -------------------------------- + + /* do an inverse fft */ - rdft( _N, -1, _bufferOne, _bitshuffle, _trigland ); + rdft( _N, -1, _buffer1, _bitshuffle, _trigland ); /* dewindow our result */ - overlapadd( _bufferOne, _N, _Wsyn, _output, _Nw, _inCount); + overlapadd( _buffer1, _N, _Wsyn, _output, _Nw, _inCount); /* set our output and adjust our retaining output buffer */ - F mult = 1./_N; + const F mult = 1./_N; for ( j = 0; j < _D; j++ ) - outOne[j] = _output[j] * mult; + out[0][j] = _output[j] * mult; for ( j = 0; j < _N-_D; j++ ) _output[j] = _output[j+_D]; diff --git a/externals/grill/fftease/src/cross~.cpp b/externals/grill/fftease/src/cross~.cpp new file mode 100644 index 00000000..52874127 --- /dev/null +++ b/externals/grill/fftease/src/cross~.cpp @@ -0,0 +1,236 @@ +/* + +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" + + +class cross: + public flext_dsp +{ + FLEXT_HEADER_S(cross,flext_dsp,setup) + +public: + cross(I argc,const t_atom *argv); + ~cross(); + +protected: + + virtual V m_dsp(I n,S *const *in,S *const *out); + virtual V m_signal(I n,S *const *in,S *const *out); + + I blsz; + F smprt; + + F *_input1,*_input2; + F *_buffer1,*_buffer2; + F *_channel1,*_channel2; + F *_output; + F *_trigland; + I *_bitshuffle; + F *_Wanal,*_Wsyn,*_Hwin; + + I _inCount; + +private: + enum { _MULT_ = 2 }; + + V Clear(); + V Delete(); + + static V setup(t_classid c); +}; + +FLEXT_LIB_DSP_V("fftease, cross~",cross) + + +V cross::setup(t_classid c) +{ +} + + +cross::cross(I argc,const t_atom *argv): + blsz(0),smprt(0) +{ + Clear(); + + AddInSignal("Messages and driver signal"); + AddInSignal("Filter signal"); + AddInSignal("Threshold signal for cross synthesis"); + AddOutSignal("Transformed signal"); +} + +cross::~cross() +{ + Delete(); +} + +V cross::Clear() +{ + _input1 = _input2 = NULL; + _buffer1 = _buffer2 = NULL; + _channel1 = _channel2 = NULL; + _output = NULL; + + _bitshuffle = NULL; + _trigland = NULL; + + _Hwin = NULL; + _Wanal = _Wsyn = NULL; +} + +V cross::Delete() +{ + if(_input1) delete[] _input1; + if(_input2) delete[] _input2; + if(_buffer1) delete[] _buffer1; + if(_buffer2) delete[] _buffer2; + if(_channel1) delete[] _channel1; + if(_channel2) delete[] _channel2; + if(_output) delete[] _output; + + if(_bitshuffle) delete[] _bitshuffle; + if(_trigland) delete[] _trigland; + + if(_Wanal) delete[] _Wanal; + if(_Wsyn) delete[] _Wsyn; + if(_Hwin) delete[] _Hwin; + + // --------------------------------------------- + +#if 0 + // T.G. These are not used + if(c_lastphase_in1) delete[] c_lastphase_in1; + if(c_lastphase_in2) delete[] c_lastphase_in2; + if(c_lastphase_out) delete[] c_lastphase_out; +#endif +} + + + +V cross::m_dsp(I n,S *const *in,S *const *out) +{ + const I _D = Blocksize(); + const F _R = Samplerate(); + + if(_D != blsz || _R != smprt) { + blsz = _D; + smprt = _R; + + Delete(); + + const int _N = _D*_MULT_,_Nw = _N,_N2 = _N>>1,_Nw2 = _Nw>>1; + + _inCount = -_Nw; + + _input1 = new F[_Nw]; + _input2 = new F[_Nw]; + _buffer1 = new F[_N]; + _buffer2 = new F[_N]; + _channel1 = new F[_N+2]; + _channel2 = new F[_N+2]; + _output = new F[_Nw]; + + _bitshuffle = new I[_N*2]; + _trigland = new F[_N*2]; + + _Wanal = new F[_Nw]; + _Wsyn = new F[_Nw]; + _Hwin = new F[_Nw]; + + init_rdft( _N, _bitshuffle, _trigland); + + // makewindows( x->Hwin, x->Wanal, x->Wsyn, x->Nw, x->N, x->D, 0); + makehanning( _Hwin, _Wanal, _Wsyn, _Nw, _N, _D, 0,0); + + // --------------------------------------------- + +#if 0 + // T.G. These are not used + /* for convert */ + c_lastphase_in1 = new F[_N2+1]; + c_lastphase_in2 = new F[_N2+1]; + c_lastphase_out = new F[_N2+1]; + c_fundamental = _R/( _N2<<1 ); + c_factor_in = _R/(_D * __TWOPI); + c_factor_out = __TWOPI * _D/_R; +#endif + } +} + +V cross::m_signal(I n,S *const *in,S *const *out) +{ + /* declare working variables */ + I i, j; + const I _D = blsz,_N = _D*_MULT_,_Nw = _N,_N2 = _N/2,_Nw2 = _Nw/2; + + _inCount += _D; + + for ( j = 0 ; j < _N-_D ; j++ ) { + _input1[j] = _input1[j+_D]; + _input2[j] = _input2[j+_D]; + } + for (i = 0; j < _N; j++,i++ ) { + _input1[j] = in[0][i]; + _input2[j] = in[1][i]; + } + + fold( _input1, _Wanal, _Nw, _buffer1, _N, _inCount ); + fold( _input2, _Wanal, _Nw, _buffer2, _N, _inCount ); + + rdft( _N, 1, _buffer1, _bitshuffle, _trigland ); + rdft( _N, 1, _buffer2, _bitshuffle, _trigland ); + + + // ---- BEGIN -------------------------------- + + // TG: filled only once per signal vector!! + float threshie = *in[2]; + + for ( i = 0; i <= _N2; i++ ) { + const I even = i<<1,odd = even+1; + + F a = ( i == _N2 ? _buffer1[1] : _buffer2[even] ); + F b = ( i == 0 || i == _N2 ? 0. : _buffer2[odd] ); + F gainer = hypot( a, b ) ; + + a = ( i == _N2 ? _buffer1[1] : _buffer1[even] ); + b = ( i == 0 || i == _N2 ? 0. : _buffer1[odd] ); + + if( gainer > threshie ) + _channel1[even] = hypot( a, b ) * gainer; + // else + // channel1[even] = hypot( a, b); + + _channel1[odd] = -atan2( b, a ); + _buffer1[even] = _channel1[even] * cos( _channel1[odd] ); + + if ( i != _N2 ) + _buffer1[odd] = -_channel1[even] * sin( _channel1[odd] ); + } + + // ---- END -------------------------------- + + rdft( _N, -1, _buffer1, _bitshuffle, _trigland ); + + overlapadd( _buffer1, _N, _Wsyn, _output, _Nw, _inCount); + + const F mult = 1./_N; + for ( j = 0; j < _D; j++ ) + out[0][j] = _output[j] * mult; + + for ( j = 0; j < _N-_D; j++ ) + _output[j] = _output[j+_D]; + for (; j < _N; j++ ) + _output[j] = 0.; +} + + + diff --git a/externals/grill/fftease/src/dentist~.cpp b/externals/grill/fftease/src/dentist~.cpp new file mode 100644 index 00000000..8c9a0379 --- /dev/null +++ b/externals/grill/fftease/src/dentist~.cpp @@ -0,0 +1,272 @@ +/* + +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 dentist: + public flext_dsp +{ + FLEXT_HEADER_S(dentist,flext_dsp,setup) + +public: + dentist(I argc,const t_atom *argv); + ~dentist(); + +protected: + + virtual V m_dsp(I n,S *const *in,S *const *out); + virtual V m_signal(I n,S *const *in,S *const *out); + + I blsz; + F smprt; + + F *_input1,*_input2; + F *_buffer1,*_buffer2; + F *_channel1,*_channel2; + F *_output; + F *_trigland; + I *_bitshuffle; + F *_Wanal,*_Wsyn,*_Hwin; + + I _inCount; + + // ----------------------------- + + I *_bin_selection; + I _tooth_count; + F _knee; + I _max_bin; // determined by _knee and fundamental frequency + + V reset_shuffle(); + +private: + enum { _MULT_ = 4 }; + + V Clear(); + V Delete(); + + V ms_knee(F knee); + V ms_teeth(I teeth) { _tooth_count = teeth; reset_shuffle(); } + + + static V setup(t_classid c); + + FLEXT_CALLBACK(reset_shuffle) + FLEXT_ATTRGET_F(_knee) + FLEXT_CALLSET_F(ms_knee) + FLEXT_ATTRGET_I(_tooth_count) + FLEXT_CALLSET_I(ms_teeth) +}; + +FLEXT_LIB_DSP_V("fftease, dentist~",dentist) + + +V dentist::setup(t_classid c) +{ + FLEXT_CADDBANG(c,0,reset_shuffle); + + FLEXT_CADDATTR_VAR(c,"knee",_knee,ms_knee); + FLEXT_CADDATTR_VAR(c,"teeth",_tooth_count,ms_teeth); +} + + +dentist::dentist(I argc,const t_atom *argv): + blsz(0),smprt(0), + _knee(500),_tooth_count(10) +{ + /* parse and set object's options given */ + if(argc >= 1) { + if(CanbeFloat(argv[0])) + _knee = GetAFloat(argv[0]); + else + post("%s - Knee must be a float value - set to %0f",thisName(),_knee); + } + if(argc >= 2) { + if(CanbeInt(argv[1])) + _tooth_count = GetAInt(argv[1]); + else + post("%s - Teeth must be an integer value - set to %0i",thisName(),_tooth_count); + } + + Clear(); + + AddInSignal("Messages and input signal"); + AddOutSignal("Transformed signal"); +} + +dentist::~dentist() +{ + Delete(); +} + +V dentist::Clear() +{ + _input1 = _input2 = NULL; + _buffer1 = _buffer2 = NULL; + _channel1 = _channel2 = NULL; + _output = NULL; + + _bitshuffle = NULL; + _trigland = NULL; + + _Hwin = NULL; + _Wanal = _Wsyn = NULL; + + // ----------------------------- + + _bin_selection = NULL; +} + +V dentist::Delete() +{ + if(_input1) delete[] _input1; + if(_buffer1) delete[] _buffer1; + if(_channel1) delete[] _channel1; +/* + if(_input2) delete[] _input2; + if(_buffer2) delete[] _buffer2; + if(_channel2) delete[] _channel2; +*/ + if(_output) delete[] _output; + + if(_bitshuffle) delete[] _bitshuffle; + if(_trigland) delete[] _trigland; + + if(_Wanal) delete[] _Wanal; + if(_Wsyn) delete[] _Wsyn; + if(_Hwin) delete[] _Hwin; + + // ----------------------------- + + if(_bin_selection) delete[] _bin_selection; +} + + +V dentist::ms_knee(F f) +{ + _knee = f; // store original + + const F funda = Samplerate()/(2*_MULT_*Blocksize()); + + // TG: This is a different, but steady correction than in original fftease + if( f < funda ) f = funda; + else if(f > funda/2) f = funda/2; + + _max_bin = 1; + for(F curfreq = 0; curfreq < f; curfreq += funda) ++_max_bin; +} + + +V dentist::m_dsp(I n,S *const *in,S *const *out) +{ + const I _D = Blocksize(); + const F _R = Samplerate(); + if(_D != blsz || _R != smprt) { + blsz = _D; + smprt = _R; + + Delete(); + // --------------------------------------------- + + const int _N = _D*_MULT_,_Nw = _N,_Nw2 = _Nw>>1,_N2 = _N>>1; + + _inCount = -_Nw; + + _input1 = new F[_Nw]; + _buffer1 = new F[_N]; + _channel1 = new F[_N+2]; + /* + _input2 = new F[_Nw]; + _buffer2 = new F[_N]; + _channel2 = new F[_N+2]; + */ + + _output = new F[_Nw]; + + _bitshuffle = new I[_N*2]; + _trigland = new F[_N*2]; + + _Wanal = new F[_Nw]; + _Wsyn = new F[_Nw]; + _Hwin = new F[_Nw]; + + init_rdft( _N, _bitshuffle, _trigland); + makewindows( _Hwin, _Wanal, _Wsyn, _Nw, _N, _D, 0); + + // --------------------------------------------- + + // calculation of _max_bin + ms_knee(_knee); + + _bin_selection = new I[_N2]; + reset_shuffle(); + } +} + +V dentist::m_signal(I n,S *const *in,S *const *out) +{ + /* declare working variables */ + I i, j; + const I _D = blsz,_N = _D*_MULT_,_Nw = _N,_N2 = _N/2,_Nw2 = _Nw/2; + + _inCount += _D; + + for ( j = 0 ; j < _N-_D ; j++ ) + _input1[j] = _input1[j+_D]; + for (i = 0; j < _N; j++,i++ ) + _input1[j] = in[0][i]; + + fold( _input1, _Wanal, _Nw, _buffer1, _N, _inCount ); + rdft( _N, 1, _buffer1, _bitshuffle, _trigland ); + + // ---- BEGIN -------------------------------- + + leanconvert( _buffer1, _channel1, _N2 ); + + for( i = 0; i < _N2 ; i++){ + if( !_bin_selection[i] ) _channel1[i*2] = 0; + } + + leanunconvert( _channel1, _buffer1, _N2 ); + + // ---- END -------------------------------- + + rdft( _N, -1, _buffer1, _bitshuffle, _trigland ); + overlapadd( _buffer1, _N, _Wsyn, _output, _Nw, _inCount); + + const F mult = 1./_N; + for ( j = 0; j < _D; j++ ) + out[0][j] = _output[j] * mult; + + for ( j = 0; j < _N-_D; j++ ) + _output[j] = _output[j+_D]; + for (; j < _N; j++ ) + _output[j] = 0.; +} + + +V dentist::reset_shuffle() +{ + const I _N2 = Blocksize()*_MULT_/2; + I teeth = _tooth_count; + + // check number of teeth + if( teeth < 0 ) teeth = 0; + else if( teeth > _N2 ) teeth = _N2; + + // clear and set random bins + I i; + for( i = 0; i < _N2; i++ ) + _bin_selection[i] = 0; + for( i = 0; i < _tooth_count; i++ ) + _bin_selection[rand()%_max_bin] = 1; +} diff --git a/externals/grill/fftease/src/disarray~.cpp b/externals/grill/fftease/src/disarray~.cpp new file mode 100644 index 00000000..428fe2d6 --- /dev/null +++ b/externals/grill/fftease/src/disarray~.cpp @@ -0,0 +1,286 @@ +/* + +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 disarray: + public flext_dsp +{ + FLEXT_HEADER_S(disarray,flext_dsp,setup) + +public: + disarray(I argc,const t_atom *argv); + ~disarray(); + +protected: + + virtual V m_dsp(I n,S *const *in,S *const *out); + virtual V m_signal(I n,S *const *in,S *const *out); + + I blsz; + F smprt; + + F *_input1,*_input2; + F *_buffer1,*_buffer2; + F *_channel1,*_channel2; + F *_output; + F *_trigland; + I *_bitshuffle; + F *_Wanal,*_Wsyn,*_Hwin; + + I _inCount,_nmult; + + // ----------------------------- + + BL _qual; + I _shuffle_count,_max_bin; + F _freq; + I *_shuffle_in,*_shuffle_out; + + + V reset_shuffle(); + +private: + V Clear(); + V Delete(); + + V ms_freq(F f); + + static V setup(t_classid c); + + FLEXT_CALLBACK(reset_shuffle) + FLEXT_ATTRGET_F(_freq) + FLEXT_CALLSET_F(ms_freq) +}; + +FLEXT_LIB_DSP_V("fftease, disarray~",disarray) + + +V disarray::setup(t_classid c) +{ + FLEXT_CADDBANG(c,0,reset_shuffle); + + FLEXT_CADDATTR_VAR(c,"freq",_freq,ms_freq); +} + + +disarray::disarray(I argc,const t_atom *argv): + blsz(0),smprt(0), + _freq(1300),_qual(false),_shuffle_count(20) +{ + /* parse and set object's options given */ + if(argc >= 1) { + if(CanbeFloat(argv[0])) + _freq = GetAFloat(argv[0]); + else + post("%s - Freq must be a float value - set to %0f",thisName(),_freq); + } + if(argc >= 2) { + if(CanbeBool(argv[1])) + _qual = GetABool(argv[1]); + else + post("%s - Quality must be a boolean value - set to %0i",thisName(),_qual?1:0); + } + if(argc >= 3) { + if(CanbeInt(argv[2])) + _shuffle_count = GetAInt(argv[2]); + else + post("%s - Shufflecount must be an integer value - set to %0i",thisName(),_shuffle_count); + } + + _nmult = _qual?4:2; + + Clear(); + + AddInSignal("Messages and input signal"); + AddOutSignal("Transformed signal"); +} + +disarray::~disarray() +{ + Delete(); +} + +V disarray::Clear() +{ + _input1 = _input2 = NULL; + _buffer1 = _buffer2 = NULL; + _channel1 = _channel2 = NULL; + _output = NULL; + + _bitshuffle = NULL; + _trigland = NULL; + + _Hwin = NULL; + _Wanal = _Wsyn = NULL; + + // ----------------------------- + + _shuffle_in = _shuffle_out = NULL; +} + +V disarray::Delete() +{ + if(_input1) delete[] _input1; + if(_buffer1) delete[] _buffer1; + if(_channel1) delete[] _channel1; +/* + if(_input2) delete[] _input2; + if(_buffer2) delete[] _buffer2; + if(_channel2) delete[] _channel2; +*/ + if(_output) delete[] _output; + + if(_bitshuffle) delete[] _bitshuffle; + if(_trigland) delete[] _trigland; + + if(_Wanal) delete[] _Wanal; + if(_Wsyn) delete[] _Wsyn; + if(_Hwin) delete[] _Hwin; + + // ----------------------------- + + if(_shuffle_in) delete[] _shuffle_in; + if(_shuffle_out) delete[] _shuffle_out; +} + + +V disarray::ms_freq(F f) +{ + _freq = f; // store original + + const F funda = Samplerate()/(2*_nmult*Blocksize()); + + // TG: This is a different, but steady correction than in original fftease + if( f < funda ) f = funda; + else if(f > funda/2) f = funda/2; + + _max_bin = 1; + for(F curfreq = 0; curfreq < f; curfreq += funda) ++_max_bin; +} + + +V disarray::m_dsp(I n,S *const *in,S *const *out) +{ + const I _D = Blocksize(); + const F _R = Samplerate(); + + if(_D != blsz || _R != smprt) { + blsz = _D; + smprt = _R; + + Delete(); + // --------------------------------------------- + + const int _N = _D*_nmult,_Nw = _N,_Nw2 = _Nw>>1,_N2 = _N>>1; + + _inCount = -_Nw; + + _input1 = new F[_Nw]; + _buffer1 = new F[_N]; + _channel1 = new F[_N+2]; + /* + _input2 = new F[_Nw]; + _buffer2 = new F[_N]; + _channel2 = new F[_N+2]; + */ + + _output = new F[_Nw]; + + _bitshuffle = new I[_N*2]; + _trigland = new F[_N*2]; + + _Wanal = new F[_Nw]; + _Wsyn = new F[_Nw]; + _Hwin = new F[_Nw]; + + init_rdft( _N, _bitshuffle, _trigland); + + if(_qual) + makewindows( _Hwin, _Wanal, _Wsyn, _Nw, _N, _D, 0); + else + makehanning( _Hwin, _Wanal, _Wsyn, _Nw, _N, _D, 0,0); + + // --------------------------------------------- + + _shuffle_in = new I[_N2]; + _shuffle_out = new I[_N2]; + + // calculate _max_bin + ms_freq(_freq); + + reset_shuffle(); + } +} + +V disarray::m_signal(I n,S *const *in,S *const *out) +{ + /* declare working variables */ + I i, j; + const I _D = blsz,_N = _D*_nmult,_Nw = _N,_N2 = _N/2,_Nw2 = _Nw/2; + + _inCount += _D; + + for ( j = 0 ; j < _N-_D ; j++ ) + _input1[j] = _input1[j+_D]; + for (i = 0; j < _N; j++,i++ ) + _input1[j] = in[0][i]; + + fold( _input1, _Wanal, _Nw, _buffer1, _N, _inCount ); + rdft( _N, 1, _buffer1, _bitshuffle, _trigland ); + + // ---- BEGIN -------------------------------- + + leanconvert( _buffer1, _channel1, _N2 ); + + for( i = 0; i < _shuffle_count ; i++){ + F tmp = _channel1[ _shuffle_in[ i ] * 2 ]; + _channel1[ _shuffle_in[ i ] * 2] = _channel1[ _shuffle_out[ i ] * 2]; + _channel1[ _shuffle_out[ i ] * 2] = tmp; + } + + leanunconvert( _channel1, _buffer1, _N2 ); + + // ---- END -------------------------------- + + rdft( _N, -1, _buffer1, _bitshuffle, _trigland ); + overlapadd( _buffer1, _N, _Wsyn, _output, _Nw, _inCount); + + const F mult = 1./_N; + for ( j = 0; j < _D; j++ ) + out[0][j] = _output[j] * mult; + + for ( j = 0; j < _N-_D; j++ ) + _output[j] = _output[j+_D]; + for (; j < _N; j++ ) + _output[j] = 0.; +} + + +V disarray::reset_shuffle() +{ + const I _N2 = Blocksize()*_nmult/2; + + I i; + for( i = 0; i < _N2; i++ ) + _shuffle_out[i] = _shuffle_in[i] = i ; + + for( i = 0; i < 10000; i++ ) { + int p1 = _shuffle_out[ rand()%_max_bin ]; + int p2 = _shuffle_out[ rand()%_max_bin ]; + int temp = _shuffle_out[ p1 ]; + _shuffle_out[ p1 ] = _shuffle_out[ p2 ]; + _shuffle_out[ p2 ] = temp; + } + +} + diff --git a/externals/grill/fftease/src/drown~.cpp b/externals/grill/fftease/src/drown~.cpp new file mode 100644 index 00000000..0e4ee4a8 --- /dev/null +++ b/externals/grill/fftease/src/drown~.cpp @@ -0,0 +1,227 @@ +/* + +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 drown: + public flext_dsp +{ + FLEXT_HEADER_S(drown,flext_dsp,setup) + +public: + drown(I argc,const t_atom *argv); + ~drown(); + +protected: + + virtual V m_dsp(I n,S *const *in,S *const *out); + virtual V m_signal(I n,S *const *in,S *const *out); + + I blsz; + F smprt; + + F *_input1,*_input2; + F *_buffer1,*_buffer2; + F *_channel1,*_channel2; + F *_output; +// F *_trigland; + // I *_bitshuffle; + F *_Wanal,*_Wsyn,*_Hwin; + + I _inCount,_nmult; + + // ----------------------------- + +private: + V Clear(); + V Delete(); + + static V setup(t_classid c); +}; + +FLEXT_LIB_DSP_V("fftease, drown~",drown) + + +V drown::setup(t_classid c) +{ +} + + +drown::drown(I argc,const t_atom *argv): + blsz(0),smprt(0),_nmult(4) +{ + Clear(); + + AddInSignal("Messages and input signal"); + AddInSignal("Threshold generator signal"); + AddInSignal("Multiplier signal for weak bins"); + AddOutSignal("Transformed signal"); +} + +drown::~drown() +{ + Delete(); +} + +V drown::Clear() +{ + _input1 = _input2 = NULL; + _buffer1 = _buffer2 = NULL; + _channel1 = _channel2 = NULL; + _output = NULL; +/* + _bitshuffle = NULL; + _trigland = NULL; +*/ + _Hwin = NULL; + _Wanal = _Wsyn = NULL; + + // ----------------------------- + +} + +V drown::Delete() +{ + if(_input1) delete[] _input1; + if(_buffer1) delete[] _buffer1; + if(_channel1) delete[] _channel1; +/* + if(_input2) delete[] _input2; + if(_buffer2) delete[] _buffer2; + if(_channel2) delete[] _channel2; +*/ + if(_output) delete[] _output; +/* + if(_bitshuffle) delete[] _bitshuffle; + if(_trigland) delete[] _trigland; +*/ + if(_Wanal) delete[] _Wanal; + if(_Wsyn) delete[] _Wsyn; + if(_Hwin) delete[] _Hwin; + + // ----------------------------- + +} + + +V drown::m_dsp(I n,S *const *in,S *const *out) +{ + const I _D = Blocksize(); + const F _R = Samplerate(); + + if(_D != blsz || _R != smprt) { + blsz = _D; + smprt = _R; + + Delete(); + // --------------------------------------------- + + const int _N = _D*_nmult,_Nw = _N,_Nw2 = _Nw>>1,_N2 = _N>>1; + + _inCount = -_Nw; + + _input1 = new F[_Nw]; + _buffer1 = new F[_N]; + _channel1 = new F[_N+2]; + /* + _input2 = new F[_Nw]; + _buffer2 = new F[_N]; + _channel2 = new F[_N+2]; + */ + + _output = new F[_Nw]; + + /* + _bitshuffle = new I[_N*2]; + _trigland = new F[_N*2]; + init_rdft( _N, _bitshuffle, _trigland); + */ + + _Wanal = new F[_Nw]; + _Wsyn = new F[_Nw]; + _Hwin = new F[_Nw]; + makewindows( _Hwin, _Wanal, _Wsyn, _Nw, _N, _D, 0); + } +} + + +/* helper function */ +static void nudist( float *_S, float *_C, float threshold, float fmult, int N2 ) +{ + int real, imag, amp, phase; + int i; + float maxamp = 1.; + for ( i = 0; i <= N2; i++ ) { + imag = phase = ( real = amp = i<<1 ) + 1; + F a = ( i == N2 ? _S[1] : _S[real] ); + F b = ( i == 0 || i == N2 ? 0. : _S[imag] ); + + _C[amp] = hypot( a, b ); + if( _C[amp] < threshold) _C[amp] *= fmult; + + _C[phase] = -atan2( b, a ); + } + + for ( i = 0; i <= N2; i++ ) { + imag = phase = ( real = amp = i<<1 ) + 1; + _S[real] = _C[amp] * cos( _C[phase] ); + if ( i != N2 ) + _S[imag] = -_C[amp] * sin( _C[phase] ); + } +} + + +V drown::m_signal(I n,S *const *in,S *const *out) +{ + /* declare working variables */ + I i, j; + const I _D = blsz,_N = _D*_nmult,_Nw = _N,_N2 = _N/2,_Nw2 = _Nw/2; + + _inCount += _D; + + for ( j = 0 ; j < _N-_D ; j++ ) + _input1[j] = _input1[j+_D]; + for (i = 0; j < _N; j++,i++ ) + _input1[j] = in[0][i]; + + fold( _input1, _Wanal, _Nw, _buffer1, _N, _inCount ); + +// rdft( _N, 1, _buffer1, _bitshuffle, _trigland ); + rfft( _buffer1, _N2, 1); + + // ---- BEGIN -------------------------------- + + { + // only first value of the signal vectors + const F thresh = in[1][0],mult = in[2][0]; + + nudist( _buffer1, _channel1, thresh, mult, _N2 ); + } + + // ---- END -------------------------------- + + rfft( _buffer1, _N2, 0); +// rdft( _N, -1, _buffer1, _bitshuffle, _trigland ); + + overlapadd( _buffer1, _N, _Wsyn, _output, _Nw, _inCount); + + const F mult = 1./_N; + for ( j = 0; j < _D; j++ ) + out[0][j] = _output[j] * mult; + + for ( j = 0; j < _N-_D; j++ ) + _output[j] = _output[j+_D]; + for (; j < _N; j++ ) + _output[j] = 0.; +} + + diff --git a/externals/grill/fftease/src/ether~.cpp b/externals/grill/fftease/src/ether~.cpp new file mode 100644 index 00000000..16fbaaff --- /dev/null +++ b/externals/grill/fftease/src/ether~.cpp @@ -0,0 +1,251 @@ +/* + +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 ether: + public flext_dsp +{ + FLEXT_HEADER_S(ether,flext_dsp,setup) + +public: + ether(I argc,const t_atom *argv); + ~ether(); + +protected: + + virtual V m_dsp(I n,S *const *in,S *const *out); + virtual V m_signal(I n,S *const *in,S *const *out); + + I blsz; + F smprt; + + F *_input1,*_input2; + F *_buffer1,*_buffer2; + F *_channel1,*_channel2; + F *_output; + F *_trigland; + I *_bitshuffle; + F *_Wanal,*_Wsyn,*_Hwin; + + I _inCount,_nmult; + + // ----------------------------- + + BL _qual,_invert; + F _threshMult; + +private: + V Clear(); + V Delete(); + + static V setup(t_classid c); + + + FLEXT_ATTRVAR_B(_invert) + FLEXT_ATTRVAR_F(_threshMult) +}; + +FLEXT_LIB_DSP_V("fftease, ether~",ether) + + +V ether::setup(t_classid c) +{ + FLEXT_CADDATTR_VAR1(c,"invert",_invert); + FLEXT_CADDATTR_VAR1(c,"thresh",_threshMult); +} + + +ether::ether(I argc,const t_atom *argv): + blsz(0),smprt(0), + _qual(false),_threshMult(0),_invert(false) +{ + /* parse and set object's options given */ + if(argc >= 1) { + if(CanbeBool(argv[0])) + _qual = GetABool(argv[0]); + else + post("%s - Quality must be a boolean value - set to %0i",thisName(),_qual?1:0); + } + + _nmult = _qual?4:2; + + Clear(); + + AddInSignal("Messages and input signal"); + AddInSignal("Reference signal"); + AddOutSignal("Transformed signal"); +} + +ether::~ether() +{ + Delete(); +} + +V ether::Clear() +{ + _input1 = _input2 = NULL; + _buffer1 = _buffer2 = NULL; + _channel1 = _channel2 = NULL; + _output = NULL; + + _bitshuffle = NULL; + _trigland = NULL; + + _Hwin = NULL; + _Wanal = _Wsyn = NULL; + + // ----------------------------- +} + +V ether::Delete() +{ + if(_input1) delete[] _input1; + if(_buffer1) delete[] _buffer1; + if(_channel1) delete[] _channel1; + + if(_input2) delete[] _input2; + if(_buffer2) delete[] _buffer2; + if(_channel2) delete[] _channel2; + + if(_output) delete[] _output; + + if(_bitshuffle) delete[] _bitshuffle; + if(_trigland) delete[] _trigland; + + if(_Wanal) delete[] _Wanal; + if(_Wsyn) delete[] _Wsyn; + if(_Hwin) delete[] _Hwin; + + // ----------------------------- + +} + + +V ether::m_dsp(I n,S *const *in,S *const *out) +{ + const I _D = Blocksize(); + const F _R = Samplerate(); + + if(_D != blsz || _R != smprt) { + blsz = _D; + smprt = _R; + + Delete(); + // --------------------------------------------- + + const int _N = _D*_nmult,_Nw = _N,_Nw2 = _Nw>>1,_N2 = _N>>1; + + _inCount = -_Nw; + + _input1 = new F[_Nw]; + _buffer1 = new F[_N]; + _channel1 = new F[_N+2]; + + _input2 = new F[_Nw]; + _buffer2 = new F[_N]; + _channel2 = new F[_N+2]; + + _output = new F[_Nw]; + + _bitshuffle = new I[_N*2]; + _trigland = new F[_N*2]; + + _Wanal = new F[_Nw]; + _Wsyn = new F[_Nw]; + _Hwin = new F[_Nw]; + + init_rdft( _N, _bitshuffle, _trigland); + + if(_qual) + makewindows( _Hwin, _Wanal, _Wsyn, _Nw, _N, _D, 0); + else + makehanning( _Hwin, _Wanal, _Wsyn, _Nw, _N, _D, 0,0); + } +} + +V ether::m_signal(I n,S *const *in,S *const *out) +{ + /* declare working variables */ + I i, j; + const I _D = blsz,_N = _D*_nmult,_Nw = _N,_N2 = _N/2,_Nw2 = _Nw/2; + + _inCount += _D; + + for ( j = 0 ; j < _N-_D ; j++ ) { + _input1[j] = _input1[j+_D]; + _input2[j] = _input2[j+_D]; + } + for (i = 0; j < _N; j++,i++ ) { + _input1[j] = in[0][i]; + _input2[j] = in[1][i]; + } + + fold( _input1, _Wanal, _Nw, _buffer1, _N, _inCount ); + fold( _input2, _Wanal, _Nw, _buffer2, _N, _inCount ); + + rdft( _N, 1, _buffer1, _bitshuffle, _trigland ); + rdft( _N, 1, _buffer2, _bitshuffle, _trigland ); + + // ---- BEGIN -------------------------------- + + F threshMult = _threshMult; + if (threshMult == 0. ) threshMult = 1; + + for ( i = 0; i <= _N2; i++ ) { + int even = i<<1,odd = even + 1; + + /* convert to polar coordinates from complex values */ + register F a,b; + + a = ( i == _N2 ? _buffer1[1] : _buffer1[even] ); + b = ( i == 0 || i == _N2 ? 0. : _buffer1[odd] ); + + _channel1[even] = hypot( a, b ); + _channel1[odd] = -atan2( b, a ); + + a = ( i == _N2 ? _buffer2[1] : _buffer2[even] ); + b = ( i == 0 || i == _N2 ? 0. : _buffer2[odd] ); + + _channel2[even] = hypot( a, b ); + _channel2[odd] = -atan2( b, a ); + + /* use simple threshold for inverse compositing */ + + if(_invert?(_channel1[even] > _channel2[even]*threshMult):(_channel1[even] < _channel2[even]*threshMult) ) + _channel1[even] = _channel2[even]; + + if (_channel1[odd] == 0. ) _channel1[odd] = _channel2[odd]; + + + /* convert back to complex form, read for the inverse fft */ + _buffer1[even] = _channel1[even] * cos( _channel1[odd] ); + + if (i != _N2 ) + _buffer1[odd] = -_channel1[even] * sin( _channel1[odd] ); + } + + // ---- END -------------------------------- + + rdft( _N, -1, _buffer1, _bitshuffle, _trigland ); + overlapadd( _buffer1, _N, _Wsyn, _output, _Nw, _inCount); + + const F mult = 1./_N; + for ( j = 0; j < _D; j++ ) + out[0][j] = _output[j] * mult; + + for ( j = 0; j < _N-_D; j++ ) + _output[j] = _output[j+_D]; + for (; j < _N; j++ ) + _output[j] = 0.; +} + diff --git a/externals/grill/fftease/src/main.cpp b/externals/grill/fftease/src/main.cpp index 1d627cf2..914d1f43 100644 --- a/externals/grill/fftease/src/main.cpp +++ b/externals/grill/fftease/src/main.cpp @@ -3,8 +3,6 @@ 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. @@ -23,20 +21,18 @@ V lib_setup() post("Originally written by Eric Lyon and Christopher Penrose"); post("for the MAX/MSP platform."); post(""); - post("flext port done by Thomas Grill, (C)2003"); + post("flext port provided by Thomas Grill, (C)2003"); post("-------------------------------------------------------"); post(""); // call the objects' setup routines FLEXT_DSP_SETUP(burrow); - -/* FLEXT_DSP_SETUP(cross); FLEXT_DSP_SETUP(dentist); FLEXT_DSP_SETUP(disarray); FLEXT_DSP_SETUP(drown); FLEXT_DSP_SETUP(ether); - +/* FLEXT_DSP_SETUP(morphine); FLEXT_DSP_SETUP(pvcompand); FLEXT_DSP_SETUP(pvoc); @@ -51,7 +47,12 @@ V lib_setup() */ #if FLEXT_SYS == FLEXT_SYS_MAX -// finder_addclass((C *)"FFTease",(C *)"xxxxx"); + finder_addclass((C *)"FFTease",(C *)"burrow~"); + finder_addclass((C *)"FFTease",(C *)"cross~"); + finder_addclass((C *)"FFTease",(C *)"dentist~"); + finder_addclass((C *)"FFTease",(C *)"disarray~"); + finder_addclass((C *)"FFTease",(C *)"drown~"); + finder_addclass((C *)"FFTease",(C *)"ether~"); #endif } diff --git a/externals/grill/fftease/src/main.h b/externals/grill/fftease/src/main.h index c0fb56f8..6dbddf7e 100644 --- a/externals/grill/fftease/src/main.h +++ b/externals/grill/fftease/src/main.h @@ -3,8 +3,6 @@ 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. @@ -16,6 +14,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define FFTEASE_VERSION "0.0.1" + #define FLEXT_ATTRIBUTES 1 #include @@ -24,6 +23,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #error You need at least flext version 0.4.1 #endif + #include "pv.h" // lazy me -- cgit v1.2.1