Update of /cvsroot/pure-data/externals/iem/iem_spec2/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11414/iem/iem_spec2/src
Added Files: iem_spec2.c iem_spec2.dsp iem_spec2.dsw iem_spec2.h iemlib.h makefile makefile_linux makefile_win spec2_1p1z_freq~.c spec2_1p1z_time~.c spec2_abs~.c spec2_add_scalar~.c spec2_add~.c spec2_block_delay~.c spec2_clip_max~.c spec2_clip_min~.c spec2_dbtopow~.c spec2_dbtorms~.c spec2_matrix_bundle_stat~.c spec2_mul_scalar~.c spec2_mul~.c spec2_powtodb~.c spec2_rmstodb~.c spec2_shift~.c spec2_sqrt~.c spec2_stretch~.c spec2_sub~.c spec2_sum~.c spec2_tab_conv~.c spec2_tabreceive_enable~.c spec2_tabreceive~.c Log Message: makefile help repaired spec2_sqrt~
--- NEW FILE: iem_spec2.dsw --- (This appears to be a binary file; contents omitted.)
--- NEW FILE: makefile_linux --- current: all
.SUFFIXES: .pd_linux
INCLUDE = -I. -I/usr/local/src/pd/src
LDFLAGS = -export-dynamic -shared LIB = -ldl -lm -lpthread
#select either the DBG and OPT compiler flags below:
CFLAGS = -DPD -DUNIX -W -Werror -Wno-unused \ -Wno-parentheses -Wno-switch -O6 -funroll-loops -fomit-frame-pointer -fno-strict-aliasing \ -DDL_OPEN
SYSTEM = $(shell uname -m)
# the sources
SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ iem_spec2.c
TARGET = iem_spec2.pd_linux
OBJ = $(SRC:.c=.o)
# # ------------------ targets ------------------------------------ #
clean: rm ../$(TARGET) rm *.o
all: $(OBJ) @echo :: $(OBJ) $(LD) $(LDFLAGS) -o $(TARGET) *.o $(LIB) strip --strip-unneeded $(TARGET) mv $(TARGET) ..
$(OBJ) : %.o : %.c $(CC) $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c
--- NEW FILE: spec2_matrix_bundle_stat~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* ---------- spec2_matrix_bundle_stat~ - signal matrix multiplication object with message matrix-coeff. ----------- */
typedef struct spec2_matrix_bundle_stat_tilde { t_object x_obj; int *x_matbuf; t_float **x_io; t_float *x_outsumbuf; int x_outsumbufsize; int x_n_in; /* columns */ int x_n_out; /* rows */ t_float x_msi; } t_spec2_matrix_bundle_stat_tilde;
t_class *spec2_matrix_bundle_stat_tilde_class;
static void spec2_matrix_bundle_stat_tilde_element(t_spec2_matrix_bundle_stat_tilde *x, t_symbol *s, int argc, t_atom *argv) { int inindex, outindex; int *matrix = x->x_matbuf;
if(argc < 2) { post("spec2_matrix_bundle_stat~ : bad list: <int> output_row_index <int> input_col_index !"); return; }
outindex = (int)atom_getint(argv); argv++; inindex = (int)atom_getint(argv) - 1;
if(inindex >= x->x_n_in) inindex = x->x_n_in - 1; if(inindex < 0) inindex = 0; if(outindex >= x->x_n_out) outindex = x->x_n_out; if(outindex < 0) outindex = 0;
matrix[inindex] = outindex; }
static void spec2_matrix_bundle_stat_tilde_list(t_spec2_matrix_bundle_stat_tilde *x, t_symbol *s, int argc, t_atom *argv) { int outindex, i, n=x->x_n_in; int *matrix = x->x_matbuf;
if(argc < n) { post("spec2_matrix_bundle_stat~ : bad list: (number_of_input_cols = %d) * <int> output_row_index !", n); return; }
for(i=0; i<n; i++) { outindex = (int)atom_getint(argv); argv++; if(outindex >= x->x_n_out) outindex = x->x_n_out; if(outindex < 0) outindex = 0; matrix[i] = outindex; } }
static void spec2_matrix_bundle_stat_tilde_bundle(t_spec2_matrix_bundle_stat_tilde *x, t_symbol *s, int argc, t_atom *argv) { spec2_matrix_bundle_stat_tilde_list(x, &s_list, argc, argv); }
/* the dsp thing */
static t_int *spec2_matrix_bundle_stat_tilde_perform(t_int *w) { t_spec2_matrix_bundle_stat_tilde *x = (t_spec2_matrix_bundle_stat_tilde *)(w[1]); int n = (int)(w[2]);
t_float **io = x->x_io; t_float *outsum; int *mat = x->x_matbuf; int n_in = x->x_n_in; /* columns */ int n_out = x->x_n_out; /* rows */ t_float *in, *out; int i, j, thrw;
outsum = x->x_outsumbuf; for(j=0; j<n_out; j++)/* reset out-buffer */ { for(i=0; i<=n; i++) *outsum++ = 0.0f; }
for(j=0; j<n_in; j++)/* each in */ { in = io[j]; thrw = mat[j]; if(thrw) { thrw--; outsum = x->x_outsumbuf + n*thrw; for(i=0; i<=n; i++) *outsum++ += *in++; } }
outsum = x->x_outsumbuf; for(j=0; j<n_out; j++)/* copy out-buffer to out */ { out = io[n_in+j]; for(i=0; i<=n; i++) *out++ = *outsum++; } return (w+3); }
static t_int *spec2_matrix_bundle_stat_tilde_perf8(t_int *w) { t_spec2_matrix_bundle_stat_tilde *x = (t_spec2_matrix_bundle_stat_tilde *)(w[1]); int n = (int)(w[2]);
t_float **io = x->x_io; t_float *outsum; int *mat = x->x_matbuf; int n_in = x->x_n_in; /* columns */ int n_out = x->x_n_out; /* rows */ t_float *in, *out; int i, j, thrw;
for(j=0; j<n_out; j++)/* reset out-buffer */ { outsum = x->x_outsumbuf + j*(n+1); for(i=n; i; i -= 8, outsum += 8) { outsum[0] = 0.0f; outsum[1] = 0.0f; outsum[2] = 0.0f; outsum[3] = 0.0f; outsum[4] = 0.0f; outsum[5] = 0.0f; outsum[6] = 0.0f; outsum[7] = 0.0f; } outsum[0] = 0.0f; }
for(j=0; j<n_in; j++)/* each in */ { in = io[j]; thrw = mat[j]; if(thrw) { thrw--; outsum = x->x_outsumbuf + (n+1)*thrw; for(i=n; i; i -= 8, outsum += 8, in += 8) { outsum[0] += in[0]; outsum[1] += in[1]; outsum[2] += in[2]; outsum[3] += in[3]; outsum[4] += in[4]; outsum[5] += in[5]; outsum[6] += in[6]; outsum[7] += in[7]; } outsum[0] += in[0]; } }
for(j=0; j<n_out; j++)/* copy out-buffer to out */ { out = io[n_in+j]; outsum = x->x_outsumbuf + j*(n+1); for (i=n; i; i -= 8, out += 8, outsum += 8) { out[0] = outsum[0]; out[1] = outsum[1]; out[2] = outsum[2]; out[3] = outsum[3]; out[4] = outsum[4]; out[5] = outsum[5]; out[6] = outsum[6]; out[7] = outsum[7]; } out[0] = outsum[0]; } return (w+3); }
static void spec2_matrix_bundle_stat_tilde_dsp(t_spec2_matrix_bundle_stat_tilde *x, t_signal **sp) { int i, n=x->x_n_out*sp[0]->s_n/2;
if(!x->x_outsumbuf) { x->x_outsumbufsize = n; x->x_outsumbuf = (t_float *)getbytes((x->x_outsumbufsize+x->x_n_out) * sizeof(t_float)); } else if(x->x_outsumbufsize != n) { x->x_outsumbuf = (t_float *)resizebytes(x->x_outsumbuf, (x->x_outsumbufsize+x->x_n_out)*sizeof(t_float), (n+x->x_n_out)*sizeof(t_float)); x->x_outsumbufsize = n; }
n = x->x_n_in + x->x_n_out; for(i=0; i<n; i++) { x->x_io[i] = sp[i]->s_vec; /*post("iovec_addr = %d", (unsigned int)x->x_io[i]);*/ }
n = sp[0]->s_n/2; if(n&7) dsp_add(spec2_matrix_bundle_stat_tilde_perform, 2, x, n); else dsp_add(spec2_matrix_bundle_stat_tilde_perf8, 2, x, n); }
/* setup/setdown things */
static void spec2_matrix_bundle_stat_tilde_free(t_spec2_matrix_bundle_stat_tilde *x) { freebytes(x->x_matbuf, x->x_n_in * sizeof(int)); freebytes(x->x_io, (x->x_n_in + x->x_n_out) * sizeof(t_float *)); if(x->x_outsumbuf) freebytes(x->x_outsumbuf, (x->x_outsumbufsize+1) * sizeof(t_float)); }
static void *spec2_matrix_bundle_stat_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_spec2_matrix_bundle_stat_tilde *x = (t_spec2_matrix_bundle_stat_tilde *)pd_new(spec2_matrix_bundle_stat_tilde_class); int i;
switch (argc) { case 0: x->x_n_in = x->x_n_out = 1; break; case 1: x->x_n_in = x->x_n_out = (int)atom_getint(argv); break; default: x->x_n_in = (int)atom_getint(argv); x->x_n_out = (int)atom_getint(argv+1); break; }
if(x->x_n_in < 1) x->x_n_in = 1; if(x->x_n_out < 1) x->x_n_out = 1; i = x->x_n_in - 1; while(i--) inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); i = x->x_n_out; while(i--) outlet_new(&x->x_obj, &s_signal); x->x_msi = 0; x->x_outsumbuf = (t_float *)0; x->x_outsumbufsize = 0; x->x_matbuf = (int *)getbytes(x->x_n_in * sizeof(int)); x->x_io = (t_float **)getbytes((x->x_n_in + x->x_n_out) * sizeof(t_float *)); return (x); }
void spec2_matrix_bundle_stat_tilde_setup(void) { spec2_matrix_bundle_stat_tilde_class = class_new(gensym("spec2_matrix_bundle_stat~"), (t_newmethod)spec2_matrix_bundle_stat_tilde_new, (t_method)spec2_matrix_bundle_stat_tilde_free, sizeof(t_spec2_matrix_bundle_stat_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(spec2_matrix_bundle_stat_tilde_class, t_spec2_matrix_bundle_stat_tilde, x_msi); class_addmethod(spec2_matrix_bundle_stat_tilde_class, (t_method)spec2_matrix_bundle_stat_tilde_dsp, gensym("dsp"), 0); class_addlist(spec2_matrix_bundle_stat_tilde_class, (t_method)spec2_matrix_bundle_stat_tilde_list); class_addmethod(spec2_matrix_bundle_stat_tilde_class, (t_method)spec2_matrix_bundle_stat_tilde_element, gensym("element"), A_GIMME, 0); class_addmethod(spec2_matrix_bundle_stat_tilde_class, (t_method)spec2_matrix_bundle_stat_tilde_bundle, gensym("bundle"), A_GIMME, 0); class_sethelpsymbol(spec2_matrix_bundle_stat_tilde_class, gensym("iemhelp2/spec2_matrix_bundle_stat~-help")); }
--- NEW FILE: spec2_powtodb~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
#define SPEC2LOGTEN 2.302585092994f
/* ------------------------ spec2_powtodb_tilde~ ------------------------- */
static t_class *spec2_powtodb_tilde_class;
typedef struct _spec2_powtodb_tilde { t_object x_obj; t_float x_msi; } t_spec2_powtodb_tilde;
static t_int *spec2_powtodb_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1;
for(; n--; in++, out++) { t_float f = *in;
if(f <= 0.0f) *out = 0.0f; else { t_float g = 100.0f + 10.0f/SPEC2LOGTEN * log(f); *out = (g < 0.0f ? 0.0f : g); } } return(w+4); }
static void spec2_powtodb_tilde_dsp(t_spec2_powtodb_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
dsp_add(spec2_powtodb_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); }
static void *spec2_powtodb_tilde_new(void) { t_spec2_powtodb_tilde *x = (t_spec2_powtodb_tilde *)pd_new(spec2_powtodb_tilde_class);
outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); }
void spec2_powtodb_tilde_setup(void) { spec2_powtodb_tilde_class = class_new(gensym("spec2_powtodb~"), (t_newmethod)spec2_powtodb_tilde_new, 0, sizeof(t_spec2_powtodb_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_powtodb_tilde_class, t_spec2_powtodb_tilde, x_msi); class_addmethod(spec2_powtodb_tilde_class, (t_method)spec2_powtodb_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_powtodb_tilde_class, gensym("iemhelp2/spec2_powtodb~-help")); }
--- NEW FILE: makefile_win ---
all: ..\iem_spec2.dll
VIS_CPP_PATH = "C:\Programme\Microsoft Visual Studio\Vc98"
PD_INST_PATH = "C:\Programme\pd"
PD_WIN_INCLUDE_PATH = /I. /I$(PD_INST_PATH)\src /I$(VIS_CPP_PATH)\include
PD_WIN_C_FLAGS = /nologo /W3 /WX /DMSW /DNT /DPD /DWIN32 /DWINDOWS /Ox -DPA_LITTLE_ENDIAN
PD_WIN_L_FLAGS = /nologo
PD_WIN_LIB = /NODEFAULTLIB:libc /NODEFAULTLIB:oldnames /NODEFAULTLIB:kernel /NODEFAULTLIB:uuid \ $(VIS_CPP_PATH)\lib\libc.lib \ $(VIS_CPP_PATH)\lib\oldnames.lib \ $(VIS_CPP_PATH)\lib\kernel32.lib \ $(VIS_CPP_PATH)\lib\wsock32.lib \ $(VIS_CPP_PATH)\lib\winmm.lib \ $(PD_INST_PATH)\bin\pd.lib
SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ iem_spec2.c
OBJ = $(SRC:.c=.obj)
.c.obj: cl $(PD_WIN_C_FLAGS) $(PD_WIN_INCLUDE_PATH) /c $*.c
..\iem_spec2.dll: $(OBJ) link $(PD_WIN_L_FLAGS) /dll /export:iem_spec2_setup \ /out:..\iem_spec2.dll $(OBJ) $(PD_WIN_LIB)
clean: del *.obj
--- NEW FILE: iem_spec2.h --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#ifndef __IEMSPEC2_H__ #define __IEMSPEC2_H__
#define DELLINE_DEF_VEC_SIZE 64
#endif
--- NEW FILE: spec2_sqrt~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
/* ------------------------ spec2_sqrt_tilde~ ------------------------- */
static t_class *spec2_sqrt_tilde_class;
#define SPEC2DUMTAB1SIZE 256 #define SPEC2DUMTAB2SIZE 1024
static t_float spec2_rsqrt_exptab[SPEC2DUMTAB1SIZE], spec2_rsqrt_mantissatab[SPEC2DUMTAB2SIZE];
static void init_spec2_rsqrt(void) { int i;
for (i=0; i<SPEC2DUMTAB1SIZE; i++) { t_float f; long l = (i ? (i == SPEC2DUMTAB1SIZE-1 ? SPEC2DUMTAB1SIZE-2 : i) : 1)<< 23;
*(long *)(&f) = l; spec2_rsqrt_exptab[i] = 1.0f/sqrt(f); }
for (i=0; i<SPEC2DUMTAB2SIZE; i++) { t_float f = 1.0f + (1.0f / (t_float)SPEC2DUMTAB2SIZE) * (t_float)i;
spec2_rsqrt_mantissatab[i] = 1.0f / sqrt(f); } }
typedef struct _spec2_sqrt_tilde { t_object x_obj; t_float x_msi; } t_spec2_sqrt_tilde;
static t_int *spec2_sqrt_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1;
while(n--) { t_float f = *in; long l = *(long *)(in++);
if(f < 0.0f) *out++ = 0.0f; else { t_float g = spec2_rsqrt_exptab[(l >> 23) & 0xff] * spec2_rsqrt_mantissatab[(l >> 13) & 0x3ff];
*out++ = f*g*(1.5f - 0.5f*g*g*f); } } return(w+4); }
static void spec2_sqrt_tilde_dsp(t_spec2_sqrt_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
dsp_add(spec2_sqrt_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); }
static void *spec2_sqrt_tilde_new(void) { t_spec2_sqrt_tilde *x = (t_spec2_sqrt_tilde *)pd_new(spec2_sqrt_tilde_class);
outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); }
void spec2_sqrt_tilde_setup(void) { init_spec2_rsqrt(); spec2_sqrt_tilde_class = class_new(gensym("spec2_sqrt~"), (t_newmethod)spec2_sqrt_tilde_new, 0, sizeof(t_spec2_sqrt_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_sqrt_tilde_class, t_spec2_sqrt_tilde, x_msi); class_addmethod(spec2_sqrt_tilde_class, (t_method)spec2_sqrt_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_sqrt_tilde_class, gensym("iemhelp2/spec2_sqrt~-help")); }
--- NEW FILE: spec2_stretch~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* -- spec2_stretch~ - stretch spectral bins --- */
typedef struct spec2_stretch_tilde { t_object x_obj; int x_blocksize; t_float x_mul; t_float *x_spec; t_float x_msi; } t_spec2_stretch_tilde;
t_class *spec2_stretch_tilde_class;
static t_int *spec2_stretch_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_stretch_tilde *x = (t_spec2_stretch_tilde *)(w[3]); int i, j, m, n = (t_int)(w[4])+1; t_float yn0, yn1, fract; t_float *spec=x->x_spec; t_float mul=x->x_mul; t_float rcp_mul = 1.0f / mul;
for(i=0; i<n; i++)/* copy spec into buffer */ spec[i] = in[i];
m = (int)((t_float)n * mul); if(m > n) m = n; for(i=0; i<m; i++)/* stretch spec-buffer */ { fract = (t_float)i * rcp_mul; j = (int)fract; fract -= (t_float)j; yn0 = spec[j]; yn1 = spec[j+1]; out[i] = (yn1 - yn0)*fract + yn0; } for(i=m; i<n; i++)/* clear residal of spec-buffer */ out[i] = 0.0f;
return(w+5); }
static void spec2_stretch_tilde_mul(t_spec2_stretch_tilde *x, t_floatarg mul) { if(mul <= 0.0f) mul = 1.0f; x->x_mul = mul; }
static void spec2_stretch_tilde_dsp(t_spec2_stretch_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
if(!x->x_blocksize) { x->x_spec = (t_float *)getbytes((n+1)*sizeof(t_float)); x->x_blocksize = n; } else if(x->x_blocksize != n) { x->x_spec = (t_float *)resizebytes(x->x_spec, (x->x_blocksize+1)*sizeof(t_float), (n+1)*sizeof(t_float)); x->x_blocksize = n; } dsp_add(spec2_stretch_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); }
static void *spec2_stretch_tilde_new(t_floatarg mul) { t_spec2_stretch_tilde *x = (t_spec2_stretch_tilde *)pd_new(spec2_stretch_tilde_class);
outlet_new(&x->x_obj, &s_signal); if(mul <= 0.0f) mul = 1.0f; x->x_blocksize = 0; x->x_mul = mul; x->x_spec = (t_float *)0; return (x); }
static void spec2_stretch_tilde_free(t_spec2_stretch_tilde *x) { if(x->x_spec) freebytes(x->x_spec, (x->x_blocksize+1) * sizeof(t_float)); }
void spec2_stretch_tilde_setup(void) { spec2_stretch_tilde_class = class_new(gensym("spec2_stretch~"), (t_newmethod)spec2_stretch_tilde_new, 0, sizeof(t_spec2_stretch_tilde), 0, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(spec2_stretch_tilde_class, t_spec2_stretch_tilde, x_msi); class_addmethod(spec2_stretch_tilde_class, (t_method)spec2_stretch_tilde_dsp, gensym("dsp"), 0); class_addfloat(spec2_stretch_tilde_class, (t_method)spec2_stretch_tilde_mul); class_sethelpsymbol(spec2_stretch_tilde_class, gensym("iemhelp/spec2_stretch~-help")); }
--- NEW FILE: spec2_tabreceive_enable~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* ------------------------ spec2_tabreceive_enable_tilde~ ------------------------- */
static t_class *spec2_tabreceive_enable_tilde_class;
typedef struct _spec2_tabreceive_enable_tilde { t_object x_obj; t_float *x_vec; t_symbol *x_arrayname; int x_enable; } t_spec2_tabreceive_enable_tilde;
static void spec2_tabreceive_enable_tilde_symbol(t_spec2_tabreceive_enable_tilde *x, t_symbol *s) { x->x_arrayname = s; }
static void spec2_tabreceive_enable_tilde_float(t_spec2_tabreceive_enable_tilde *x, t_floatarg f) { int i=(int)f;
if(i) i = 1;
x->x_enable = i; }
static t_int *spec2_tabreceive_enable_tilde_perform(t_int *w) { t_spec2_tabreceive_enable_tilde *x = (t_spec2_tabreceive_enable_tilde *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1; t_float *vec = x->x_vec;
if(vec && x->x_enable) while(n--) *out++ = *vec++; else while(n--) *out++ = 0.0f; return(w+4); }
static t_int *spec2_tabreceive_enable_tilde_perf16(t_int *w) { t_spec2_tabreceive_enable_tilde *x = (t_spec2_tabreceive_enable_tilde *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]; t_float *vec = x->x_vec;
if(vec && x->x_enable) { while(n) { out[0] = vec[0]; out[1] = vec[1]; out[2] = vec[2]; out[3] = vec[3]; out[4] = vec[4]; out[5] = vec[5]; out[6] = vec[6]; out[7] = vec[7]; out[8] = vec[8]; out[9] = vec[9]; out[10] = vec[10]; out[11] = vec[11]; out[12] = vec[12]; out[13] = vec[13]; out[14] = vec[14]; out[15] = vec[15];
vec += 16; out += 16; n -= 16; } out[0] = vec[0]; } else { while(n) { out[0] = 0.0f; out[1] = 0.0f; out[2] = 0.0f; out[3] = 0.0f; out[4] = 0.0f; out[5] = 0.0f; out[6] = 0.0f; out[7] = 0.0f; out[8] = 0.0f; out[9] = 0.0f; out[10] = 0.0f; out[11] = 0.0f; out[12] = 0.0f; out[13] = 0.0f; out[14] = 0.0f; out[15] = 0.0f;
out += 16; n -= 16; } out[0] = 0.0f; }
return(w+4); }
static void spec2_tabreceive_enable_tilde_dsp(t_spec2_tabreceive_enable_tilde *x, t_signal **sp) { t_garray *a; int vecsize;
if(!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if(*x->x_arrayname->s_name) error("spec2_tabreceive_enable~: %s: no such array", x->x_arrayname->s_name); } else if(!garray_getfloatarray(a, &vecsize, &x->x_vec)) error("%s: bad template for spec2_tabreceive_enable~", x->x_arrayname->s_name); else { int n = sp[0]->s_n;
if(n < vecsize) vecsize = n; vecsize /= 2; if(vecsize&15) dsp_add(spec2_tabreceive_enable_tilde_perform, 3, x, sp[0]->s_vec, vecsize); else dsp_add(spec2_tabreceive_enable_tilde_perf16, 3, x, sp[0]->s_vec, vecsize); } }
static void *spec2_tabreceive_enable_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_spec2_tabreceive_enable_tilde *x = (t_spec2_tabreceive_enable_tilde *)pd_new(spec2_tabreceive_enable_tilde_class);
x->x_enable = 0; if((argc >= 1) && IS_A_SYMBOL(argv,0)) x->x_arrayname = atom_getsymbolarg(0, argc, argv); if((argc >= 2) && IS_A_FLOAT(argv,1)) x->x_enable = (int)atom_getintarg(1, argc, argv); if(x->x_enable) x->x_enable = 1;
outlet_new(&x->x_obj, &s_signal); return (x); }
void spec2_tabreceive_enable_tilde_setup(void) { spec2_tabreceive_enable_tilde_class = class_new(gensym("spec2_tabreceive_enable~"), (t_newmethod)spec2_tabreceive_enable_tilde_new, 0, sizeof(t_spec2_tabreceive_enable_tilde), 0, A_GIMME, 0); class_addmethod(spec2_tabreceive_enable_tilde_class, (t_method)spec2_tabreceive_enable_tilde_dsp, gensym("dsp"), 0); class_addsymbol(spec2_tabreceive_enable_tilde_class, (t_method)spec2_tabreceive_enable_tilde_symbol); class_addfloat(spec2_tabreceive_enable_tilde_class, (t_method)spec2_tabreceive_enable_tilde_float); class_sethelpsymbol(spec2_tabreceive_enable_tilde_class, gensym("iemhelp2/spec2_tabreceive_enable~-help")); }
--- NEW FILE: spec2_rmstodb~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
#define SPEC2LOGTEN 2.302585092994f
/* ------------------------ spec2_rmstodb_tilde~ ------------------------- */
static t_class *spec2_rmstodb_tilde_class;
typedef struct _spec2_rmstodb_tilde { t_object x_obj; t_float x_msi; } t_spec2_rmstodb_tilde;
static t_int *spec2_rmstodb_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1;
for(; n--; in++, out++) { t_float f = *in;
if(f <= 0.0f) *out = 0.0f; else { t_float g = 100.0f + 20.0f/SPEC2LOGTEN * log(f); *out = (g < 0.0f ? 0.0f : g); } } return(w+4); }
static void spec2_rmstodb_tilde_dsp(t_spec2_rmstodb_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
dsp_add(spec2_rmstodb_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); }
static void *spec2_rmstodb_tilde_new(void) { t_spec2_rmstodb_tilde *x = (t_spec2_rmstodb_tilde *)pd_new(spec2_rmstodb_tilde_class);
outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); }
void spec2_rmstodb_tilde_setup(void) { spec2_rmstodb_tilde_class = class_new(gensym("spec2_rmstodb~"), (t_newmethod)spec2_rmstodb_tilde_new, 0, sizeof(t_spec2_rmstodb_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_rmstodb_tilde_class, t_spec2_rmstodb_tilde, x_msi); class_addmethod(spec2_rmstodb_tilde_class, (t_method)spec2_rmstodb_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_rmstodb_tilde_class, gensym("iemhelp2/spec2_rmstodb~-help")); }
--- NEW FILE: iem_spec2.dsp --- # Microsoft Developer Studio Project File - Name="iem_spec2" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN **
# TARGTYPE "Win32 (x86) External Target" 0x0106
CFG=iem_spec2 - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "iem_spec2.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "iem_spec2.mak" CFG="iem_spec2 - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "iem_spec2 - Win32 Release" (basierend auf "Win32 (x86) External Target") !MESSAGE "iem_spec2 - Win32 Debug" (basierend auf "Win32 (x86) External Target") !MESSAGE
# Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath ""
!IF "$(CFG)" == "iem_spec2 - Win32 Release"
# PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_spec2.exe" # PROP Bsc_Name "iem_spec2.bsc" # PROP Target_Dir ""
!ELSEIF "$(CFG)" == "iem_spec2 - Win32 Debug"
# PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Cmd_Line "NMAKE /f makefile_win" # PROP BASE Rebuild_Opt "/a" # PROP BASE Target_File "makefile_win.exe" # PROP BASE Bsc_Name "makefile_win.bsc" # PROP BASE Target_Dir "" # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Cmd_Line "NMAKE /f makefile_win" # PROP Rebuild_Opt "/a" # PROP Target_File "iem_spec2.exe" # PROP Bsc_Name "iem_spec2.bsc" # PROP Target_Dir ""
!ENDIF
# Begin Target
# Name "iem_spec2 - Win32 Release" # Name "iem_spec2 - Win32 Debug"
!IF "$(CFG)" == "iem_spec2 - Win32 Release"
!ELSEIF "$(CFG)" == "iem_spec2 - Win32 Debug"
!ENDIF
# Begin Source File
SOURCE=.\makefile_win # End Source File # End Target # End Project
--- NEW FILE: spec2_dbtorms~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
#define SPEC2LOGTEN 2.302585092994f
/* ------------------------ spec2_dbtorms_tilde~ ------------------------- */
static t_class *spec2_dbtorms_tilde_class;
typedef struct _spec2_dbtorms_tilde { t_object x_obj; t_float x_msi; } t_spec2_dbtorms_tilde;
static t_int *spec2_dbtorms_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1;
for (; n--; in++, out++) { t_float f = *in;
if(f <= 0.0f) *out = 0.0f; else { if(f > 485.0f) f = 485.0f; *out = exp((SPEC2LOGTEN * 0.05f) * (f-100.0f)); } } return(w+4); }
static void spec2_dbtorms_tilde_dsp(t_spec2_dbtorms_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
dsp_add(spec2_dbtorms_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); }
static void *spec2_dbtorms_tilde_new(void) { t_spec2_dbtorms_tilde *x = (t_spec2_dbtorms_tilde *)pd_new(spec2_dbtorms_tilde_class);
outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); }
void spec2_dbtorms_tilde_setup(void) { spec2_dbtorms_tilde_class = class_new(gensym("spec2_dbtorms~"), (t_newmethod)spec2_dbtorms_tilde_new, 0, sizeof(t_spec2_dbtorms_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_dbtorms_tilde_class, t_spec2_dbtorms_tilde, x_msi); class_addmethod(spec2_dbtorms_tilde_class, (t_method)spec2_dbtorms_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_dbtorms_tilde_class, gensym("iemhelp2/spec2_dbtorms~-help")); }
--- NEW FILE: spec2_tab_conv~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* -- spec2_tab_conv~ - convolute a spectrum with a table --- */
typedef struct spec2_tab_conv_tilde { t_object x_obj; t_float *x_spec; t_float *x_beg_array; int x_blocksize; int x_winsize; int x_has_changed; t_symbol *x_sym_array; t_float x_msi; } t_spec2_tab_conv_tilde;
t_class *spec2_tab_conv_tilde_class;
static void spec2_tab_conv_tilde_set(t_spec2_tab_conv_tilde *x, t_symbol *s, int argc, t_atom *argv) { if(argc >= 2) { x->x_sym_array = (t_symbol *)(atom_getsymbol(argv)); argv++; x->x_winsize = (int)(atom_getint(argv)); x->x_has_changed = 1; } }
static t_int *spec2_tab_conv_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_tab_conv_tilde *x = (t_spec2_tab_conv_tilde *)(w[3]); t_float sum=0.0f; t_float *vec1, *vec2, *vec3, *win; int i, m, n = (int)(w[4])+1; int j, ws=x->x_winsize;
vec2 = x->x_spec + n; vec1 = vec2; vec3 = vec2 + 2*n - 2;
for(i=0; i<n; i++) { sum = in[i]; *vec2++ = sum; *vec1-- = sum; *vec3-- = sum; } vec2 = x->x_spec + n - ws/2; win = x->x_beg_array;
for(i=0; i<n; i++) { sum = 0.0f; for(j=0; j<ws; j++) sum += win[j] * vec2[j]; out[i] = sum; vec2++; } return(w+5); }
static void spec2_tab_conv_tilde_dsp(t_spec2_tab_conv_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2; t_garray *a; int n_points;
if(x->x_has_changed) { x->x_has_changed = 0; if(!(a = (t_garray *)pd_findbyclass(x->x_sym_array, garray_class))) { if(*x->x_sym_array->s_name) error("spec2_tab_conv~: %s: no such array", x->x_sym_array->s_name); } else if(!garray_getfloatarray(a, &n_points, &x->x_beg_array)) error("%s: bad template for spec2_tab_conv~", x->x_sym_array->s_name); else { if(n_points > (n+1)) n_points = n+1; if(x->x_winsize < 0) x->x_winsize = 0; if(x->x_winsize > n_points) x->x_winsize = n_points; } }
if(!x->x_blocksize) { x->x_spec = (t_float *)getbytes(3*(n+1)*sizeof(t_float)); x->x_blocksize = n; } else if(x->x_blocksize != n) { x->x_spec = (t_float *)resizebytes(x->x_spec, 3*(x->x_blocksize+1)*sizeof(t_float), 3*(n+1)*sizeof(t_float)); x->x_blocksize = n; }
dsp_add(spec2_tab_conv_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); }
static void spec2_tab_conv_tilde_free(t_spec2_tab_conv_tilde *x) { if(x->x_spec) freebytes(x->x_spec, 3*(x->x_blocksize+1)*sizeof(t_float)); }
static void *spec2_tab_conv_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_spec2_tab_conv_tilde *x = (t_spec2_tab_conv_tilde *)pd_new(spec2_tab_conv_tilde_class);
if(argc >= 2) { x->x_sym_array = (t_symbol *)(atom_getsymbol(argv)); argv++; x->x_winsize = (int)(atom_getint(argv)); x->x_spec = (t_float *)0; x->x_beg_array = (t_float *)0; x->x_blocksize = 0; x->x_has_changed = 1; outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return(x); } else { post("spec2_tab_conv~-ERROR: needs 2 args: <sym> convolution-array-name + <float> convolution-array-size !!!"); return(0); } }
void spec2_tab_conv_tilde_setup(void) { spec2_tab_conv_tilde_class = class_new(gensym("spec2_tab_conv~"), (t_newmethod)spec2_tab_conv_tilde_new, (t_method)spec2_tab_conv_tilde_free, sizeof(t_spec2_tab_conv_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(spec2_tab_conv_tilde_class, t_spec2_tab_conv_tilde, x_msi); class_addmethod(spec2_tab_conv_tilde_class, (t_method)spec2_tab_conv_tilde_dsp, gensym("dsp"), 0); class_addmethod(spec2_tab_conv_tilde_class, (t_method)spec2_tab_conv_tilde_set, gensym("set"), A_GIMME, 0); class_sethelpsymbol(spec2_tab_conv_tilde_class, gensym("iemhelp/spec2_tab_conv~-help")); }
--- NEW FILE: spec2_sub~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* -------------------------- spec2_sub~ ------------------------------ */ static t_class *spec2_sub_tilde_class;
typedef struct _spec2_sub_tilde { t_object x_obj; t_float x_msi; } t_spec2_sub_tilde;
static t_int *spec2_sub_tilde_perform(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int i, n = (t_int)(w[4]);
for(i=0; i<=n; i++) { out[i] = in1[i] - in2[i]; } return(w+5); }
static t_int *spec2_sub_tilde_perf16(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (t_int)(w[4]);
while(n) { out[0] = in1[0] - in2[0]; out[1] = in1[1] - in2[1]; out[2] = in1[2] - in2[2]; out[3] = in1[3] - in2[3]; out[4] = in1[4] - in2[4]; out[5] = in1[5] - in2[5]; out[6] = in1[6] - in2[6]; out[7] = in1[7] - in2[7]; out[8] = in1[8] - in2[8]; out[9] = in1[9] - in2[9]; out[10] = in1[10] - in2[10]; out[11] = in1[11] - in2[11]; out[12] = in1[12] - in2[12]; out[13] = in1[13] - in2[13]; out[14] = in1[14] - in2[14]; out[15] = in1[15] - in2[15];
in1 += 16; in2 += 16; out += 16; n -= 16; } out[0] = in1[0] - in2[0]; return(w+5); }
static void spec2_sub_tilde_dsp(t_spec2_sub_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
if(n&15) dsp_add(spec2_sub_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); else dsp_add(spec2_sub_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); }
static void *spec2_sub_tilde_new(void) { t_spec2_sub_tilde *x = (t_spec2_sub_tilde *)pd_new(spec2_sub_tilde_class);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); }
static void spec2_sub_tilde_free(t_spec2_sub_tilde *x) { }
void spec2_sub_tilde_setup(void) { spec2_sub_tilde_class = class_new(gensym("spec2_sub~"), (t_newmethod)spec2_sub_tilde_new, (t_method)spec2_sub_tilde_free, sizeof(t_spec2_sub_tilde), 0, 0); class_addcreator((t_newmethod)spec2_sub_tilde_new, gensym("spec2-~"), 0); CLASS_MAINSIGNALIN(spec2_sub_tilde_class, t_spec2_sub_tilde, x_msi); class_addmethod(spec2_sub_tilde_class, (t_method)spec2_sub_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_sub_tilde_class, gensym("iemhelp2/spec2_sub~-help")); }
--- NEW FILE: makefile --- current: all
.SUFFIXES: .pd_linux
INCLUDE = -I. -I/usr/local/src/pd/src
LDFLAGS = -export-dynamic -shared LIB = -ldl -lm -lpthread
#select either the DBG and OPT compiler flags below:
CFLAGS = -DPD -DUNIX -W -Werror -Wno-unused \ -Wno-parentheses -Wno-switch -O6 -funroll-loops -fomit-frame-pointer -fno-strict-aliasing \ -DDL_OPEN
SYSTEM = $(shell uname -m)
# the sources
SRC = spec2_1p1z_freq~.c \ spec2_1p1z_time~.c \ spec2_abs~.c \ spec2_add_scalar~.c \ spec2_add~.c \ spec2_block_delay~.c \ spec2_clip_max~.c \ spec2_clip_min~.c \ spec2_dbtopow~.c \ spec2_dbtorms~.c \ spec2_matrix_bundle_stat~.c \ spec2_mul_scalar~.c \ spec2_mul~.c \ spec2_powtodb~.c \ spec2_rmstodb~.c \ spec2_shift~.c \ spec2_sqrt~.c \ spec2_stretch~.c \ spec2_sub~.c \ spec2_sum~.c \ spec2_tab_conv~.c \ spec2_tabreceive_enable~.c \ spec2_tabreceive~.c \ iem_spec2.c
TARGET = iem_spec2.pd_linux
OBJ = $(SRC:.c=.o)
# # ------------------ targets ------------------------------------ #
clean: rm ../$(TARGET) rm *.o
all: $(OBJ) @echo :: $(OBJ) $(LD) $(LDFLAGS) -o $(TARGET) *.o $(LIB) strip --strip-unneeded $(TARGET) mv $(TARGET) ..
$(OBJ) : %.o : %.c $(CC) $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c
--- NEW FILE: spec2_block_delay~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* -------------------------- spec2_block_delay~ ------------------------------ */ static t_class *spec2_block_delay_tilde_class;
typedef struct _spec2_block_delay_tilde { t_object x_obj; t_float *x_begmem; int x_blocksize; t_float x_msi; } t_spec2_block_delay_tilde;
static t_int *spec2_block_delay_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_block_delay_tilde *x = (t_spec2_block_delay_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float *rw_vec;
rw_vec = x->x_begmem; for(i=0; i<=n; i++) { t_float f = in[i]; out[i] = rw_vec[i]; rw_vec[i] = f; } return(w+5); }
static t_int *spec2_block_delay_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_block_delay_tilde *x = (t_spec2_block_delay_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float *rw_vec, ff;
rw_vec = x->x_begmem; while(n) { t_float f[16];
f[0] = in[0]; f[1] = in[1]; f[2] = in[2]; f[3] = in[3]; f[4] = in[4]; f[5] = in[5]; f[6] = in[6]; f[7] = in[7]; f[8] = in[8]; f[9] = in[9]; f[10] = in[10]; f[11] = in[11]; f[12] = in[12]; f[13] = in[13]; f[14] = in[14]; f[15] = in[15];
out[0] = rw_vec[0]; out[1] = rw_vec[1]; out[2] = rw_vec[2]; out[3] = rw_vec[3]; out[4] = rw_vec[4]; out[5] = rw_vec[5]; out[6] = rw_vec[6]; out[7] = rw_vec[7]; out[8] = rw_vec[8]; out[9] = rw_vec[9]; out[10] = rw_vec[10]; out[11] = rw_vec[11]; out[12] = rw_vec[12]; out[13] = rw_vec[13]; out[14] = rw_vec[14]; out[15] = rw_vec[15];
rw_vec[0] = f[0]; rw_vec[1] = f[1]; rw_vec[2] = f[2]; rw_vec[3] = f[3]; rw_vec[4] = f[4]; rw_vec[5] = f[5]; rw_vec[6] = f[6]; rw_vec[7] = f[7]; rw_vec[8] = f[8]; rw_vec[9] = f[9]; rw_vec[10] = f[10]; rw_vec[11] = f[11]; rw_vec[12] = f[12]; rw_vec[13] = f[13]; rw_vec[14] = f[14]; rw_vec[15] = f[15];
rw_vec += 16; in += 16; out += 16; n -= 16; } ff = in[0]; out[0] = rw_vec[0]; rw_vec[0] = ff; return(w+5); }
static void spec2_block_delay_tilde_dsp(t_spec2_block_delay_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
if(!x->x_blocksize)/*first time*/ { x->x_begmem = (t_float *)getbytes((n+1) * sizeof(t_float)); x->x_blocksize = n; } else if(x->x_blocksize != n) { x->x_begmem = (t_float *)resizebytes(x->x_begmem, (x->x_blocksize+1)*sizeof(t_float), (n+1)*sizeof(t_float)); x->x_blocksize = n; } if(n&15) dsp_add(spec2_block_delay_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); else dsp_add(spec2_block_delay_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); }
static void *spec2_block_delay_tilde_new(void) { t_spec2_block_delay_tilde *x = (t_spec2_block_delay_tilde *)pd_new(spec2_block_delay_tilde_class);
x->x_blocksize = 0; x->x_begmem = (t_float *)0; outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); }
static void spec2_block_delay_tilde_free(t_spec2_block_delay_tilde *x) { if(x->x_begmem) freebytes(x->x_begmem, (x->x_blocksize+1) * sizeof(t_float)); }
void spec2_block_delay_tilde_setup(void) { spec2_block_delay_tilde_class = class_new(gensym("spec2_block_delay~"), (t_newmethod)spec2_block_delay_tilde_new, (t_method)spec2_block_delay_tilde_free, sizeof(t_spec2_block_delay_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_block_delay_tilde_class, t_spec2_block_delay_tilde, x_msi); class_addmethod(spec2_block_delay_tilde_class, (t_method)spec2_block_delay_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_block_delay_tilde_class, gensym("iemhelp2/spec2_block_delay~-help")); }
--- NEW FILE: spec2_abs~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
/* ------------------------ spec2_abs_tilde~ ------------------------- */ static t_class *spec2_abs_tilde_class;
typedef struct _spec2_abs_tilde { t_object x_obj; t_float x_msi; } t_spec2_abs_tilde;
static t_int *spec2_abs_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1;
while(n--) { *in++ = fabs(*out++); } return(w+4); }
static t_int *spec2_abs_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3];
while(n) { in[0] = fabs(out[0]); in[1] = fabs(out[1]); in[2] = fabs(out[2]); in[3] = fabs(out[3]); in[4] = fabs(out[4]); in[5] = fabs(out[5]); in[6] = fabs(out[6]); in[7] = fabs(out[7]); in[8] = fabs(out[8]); in[9] = fabs(out[9]); in[10] = fabs(out[10]); in[11] = fabs(out[11]); in[12] = fabs(out[12]); in[13] = fabs(out[13]); in[14] = fabs(out[14]); in[15] = fabs(out[15]);
in += 16; out += 16; n -= 16; } in[0] = fabs(out[0]); return(w+4); }
static void spec2_abs_tilde_dsp(t_spec2_abs_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
if(n&15) dsp_add(spec2_abs_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); else dsp_add(spec2_abs_tilde_perf16, 3, sp[0]->s_vec, sp[0]->s_vec, n); }
static void *spec2_abs_tilde_new(void) { t_spec2_abs_tilde *x = (t_spec2_abs_tilde *)pd_new(spec2_abs_tilde_class);
outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); }
void spec2_abs_tilde_setup(void) { spec2_abs_tilde_class = class_new(gensym("spec2_abs~"), (t_newmethod)spec2_abs_tilde_new, 0, sizeof(t_spec2_abs_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_abs_tilde_class, t_spec2_abs_tilde, x_msi); class_addmethod(spec2_abs_tilde_class, (t_method)spec2_abs_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_abs_tilde_class, gensym("iemhelp2/spec2_abs~-help")); }
--- NEW FILE: iemlib.h --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#ifndef __IEMLIB_H__ #define __IEMLIB_H__
#define IS_A_POINTER(atom,index) ((atom+index)->a_type == A_POINTER) #define IS_A_FLOAT(atom,index) ((atom+index)->a_type == A_FLOAT) #define IS_A_SYMBOL(atom,index) ((atom+index)->a_type == A_SYMBOL) #define IS_A_DOLLAR(atom,index) ((atom+index)->a_type == A_DOLLAR) #define IS_A_DOLLSYM(atom,index) ((atom+index)->a_type == A_DOLLSYM) #define IS_A_SEMI(atom,index) ((atom+index)->a_type == A_SEMI) #define IS_A_COMMA(atom,index) ((atom+index)->a_type == A_COMMA)
#ifdef NT int sys_noloadbang; //t_symbol *iemgui_key_sym=0; #include <io.h> #else extern int sys_noloadbang; //extern t_symbol *iemgui_key_sym; #include <unistd.h> #endif
#define DEFDELVS 64 #define XTRASAMPS 4 #define SAMPBLK 4
#define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */
/* machine-dependent definitions. These ifdefs really should have been by CPU type and not by operating system! */ #ifdef IRIX /* big-endian. Most significant byte is at low address in memory */ #define HIOFFSET 0 /* word offset to find MSB */ #define LOWOFFSET 1 /* word offset to find LSB */ #define int32 long /* a data type that has 32 bits */ #else #ifdef MSW /* little-endian; most significant byte is at highest address */ #define HIOFFSET 1 #define LOWOFFSET 0 #define int32 long #else #ifdef __FreeBSD__ #include <machine/endian.h> #if BYTE_ORDER == LITTLE_ENDIAN #define HIOFFSET 1 #define LOWOFFSET 0 #else #define HIOFFSET 0 /* word offset to find MSB */ #define LOWOFFSET 1 /* word offset to find LSB */ #endif /* BYTE_ORDER */ #include <sys/types.h> #define int32 int32_t #endif #ifdef __linux__
#include <endian.h>
#if !defined(__BYTE_ORDER) || !defined(__LITTLE_ENDIAN) #error No byte order defined #endif
#if __BYTE_ORDER == __LITTLE_ENDIAN #define HIOFFSET 1 #define LOWOFFSET 0 #else #define HIOFFSET 0 /* word offset to find MSB */ #define LOWOFFSET 1 /* word offset to find LSB */ #endif /* __BYTE_ORDER */
#include <sys/types.h> #define int32 int32_t
#else #ifdef __APPLE__ #define HIOFFSET 0 /* word offset to find MSB */ #define LOWOFFSET 1 /* word offset to find LSB */ #define int32 int /* a data type that has 32 bits */
#endif /* __APPLE__ */ #endif /* __linux__ */ #endif /* MSW */ #endif /* SGI */
union tabfudge { double tf_d; int32 tf_i[2]; };
#ifdef __i386__ #define IEM_DENORMAL(f) ((((*(unsigned int*)&(f))&0x60000000)==0) || \ (((*(unsigned int*)&(f))&0x60000000)==0x60000000)) /* more stringent test: anything not between 1e-19 and 1e19 in absolute val */ #else
#define IEM_DENORMAL(f) 0
#endif
#endif
--- NEW FILE: spec2_1p1z_time~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* -------------------------- spec2_1p1z_time~ ------------------------------ */
static t_class *spec2_1p1z_time_tilde_class;
typedef struct _spec2_1p1z_time_tilde { t_object x_obj; t_float x_a0; t_float x_a1; t_float x_b1; t_float *x_begmem_forw; t_float *x_begmem_back; int x_blocksize; t_float x_msi; } t_spec2_1p1z_time_tilde;
static void spec2_1p1z_time_tilde_list(t_spec2_1p1z_time_tilde *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { x->x_a0 = (t_float)atom_getfloatarg(0, argc, argv); x->x_a1 = (t_float)atom_getfloatarg(1, argc, argv); x->x_b1 = (t_float)atom_getfloatarg(2, argc, argv); } }
static t_int *spec2_1p1z_time_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_1p1z_time_tilde *x = (t_spec2_1p1z_time_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float a0 = x->x_a0; t_float a1 = x->x_a1; t_float b1 = x->x_b1; t_float *vec_forw = x->x_begmem_forw; t_float *vec_back = x->x_begmem_back; t_float f;
for(i=0; i<=n; i++) { f = in[i]; out[i] = a0*f + a1*vec_forw[i] + b1*vec_back[i]; vec_forw[i] = f; vec_back[i] = out[i]; } return(w+5); }
static t_int *spec2_1p1z_time_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_1p1z_time_tilde *x = (t_spec2_1p1z_time_tilde *)(w[3]); int n = (t_int)(w[4]); t_float a0 = x->x_a0; t_float a1 = x->x_a1; t_float b1 = x->x_b1; t_float *vec_forw = x->x_begmem_forw; t_float *vec_back = x->x_begmem_back; t_float ff;
while(n) { t_float f[16];
f[0] = in[0]; f[1] = in[1]; f[2] = in[2]; f[3] = in[3]; f[4] = in[4]; f[5] = in[5]; f[6] = in[6]; f[7] = in[7]; f[8] = in[8]; f[9] = in[9]; f[10] = in[10]; f[11] = in[11]; f[12] = in[12]; f[13] = in[13]; f[14] = in[14]; f[15] = in[15];
out[0] = a0*f[0] + a1*vec_forw[0] + b1*vec_back[0]; out[1] = a0*f[1] + a1*vec_forw[1] + b1*vec_back[1]; out[2] = a0*f[2] + a1*vec_forw[2] + b1*vec_back[2]; out[3] = a0*f[3] + a1*vec_forw[3] + b1*vec_back[3]; out[4] = a0*f[4] + a1*vec_forw[4] + b1*vec_back[4]; out[5] = a0*f[5] + a1*vec_forw[5] + b1*vec_back[5]; out[6] = a0*f[6] + a1*vec_forw[6] + b1*vec_back[6]; out[7] = a0*f[7] + a1*vec_forw[7] + b1*vec_back[7]; out[8] = a0*f[8] + a1*vec_forw[8] + b1*vec_back[8]; out[9] = a0*f[9] + a1*vec_forw[9] + b1*vec_back[9]; out[10] = a0*f[10] + a1*vec_forw[10] + b1*vec_back[10]; out[11] = a0*f[11] + a1*vec_forw[11] + b1*vec_back[11]; out[12] = a0*f[12] + a1*vec_forw[12] + b1*vec_back[12]; out[13] = a0*f[13] + a1*vec_forw[13] + b1*vec_back[13]; out[14] = a0*f[14] + a1*vec_forw[14] + b1*vec_back[14]; out[15] = a0*f[15] + a1*vec_forw[15] + b1*vec_back[15];
vec_forw[0] = f[0]; vec_forw[1] = f[1]; vec_forw[2] = f[2]; vec_forw[3] = f[3]; vec_forw[4] = f[4]; vec_forw[5] = f[5]; vec_forw[6] = f[6]; vec_forw[7] = f[7]; vec_forw[8] = f[8]; vec_forw[9] = f[9]; vec_forw[10] = f[10]; vec_forw[11] = f[11]; vec_forw[12] = f[12]; vec_forw[13] = f[13]; vec_forw[14] = f[14]; vec_forw[15] = f[15];
vec_back[0] = out[0]; vec_back[1] = out[1]; vec_back[2] = out[2]; vec_back[3] = out[3]; vec_back[4] = out[4]; vec_back[5] = out[5]; vec_back[6] = out[6]; vec_back[7] = out[7]; vec_back[8] = out[8]; vec_back[9] = out[9]; vec_back[10] = out[10]; vec_back[11] = out[11]; vec_back[12] = out[12]; vec_back[13] = out[13]; vec_back[14] = out[14]; vec_back[15] = out[15];
in += 16; out += 16; vec_forw += 16; vec_back += 16; n -= 16; } ff = in[0]; out[0] = a0*ff + a1*vec_forw[0] + b1*vec_back[0]; vec_forw[0] = ff; vec_back[0] = out[0]; return(w+5); }
static void spec2_1p1z_time_tilde_dsp(t_spec2_1p1z_time_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
if(!x->x_blocksize)/*first time*/ { x->x_begmem_forw = (t_float *)getbytes(2 * (n+1) * sizeof(t_float)); x->x_blocksize = n; x->x_begmem_back = x->x_begmem_forw + n + 1; } else if(x->x_blocksize != n) { x->x_begmem_forw = (t_float *)resizebytes(x->x_begmem_forw, 2*(x->x_blocksize+1)*sizeof(t_float), 2*(n+1)*sizeof(t_float)); x->x_blocksize = n; x->x_begmem_back = x->x_begmem_forw + n +1; } if(n&15) dsp_add(spec2_1p1z_time_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); else dsp_add(spec2_1p1z_time_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); }
static void *spec2_1p1z_time_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_spec2_1p1z_time_tilde *x = (t_spec2_1p1z_time_tilde *)pd_new(spec2_1p1z_time_tilde_class);
outlet_new(&x->x_obj, &s_signal); x->x_blocksize = 0; x->x_begmem_forw = (t_float *)0; if(argc >= 3) spec2_1p1z_time_tilde_list(x, s, argc, argv); else { x->x_a0 = 1.0f; x->x_a1 = 0.0f; x->x_b1 = 0.0f; } x->x_msi = 0.0f; return (x); }
static void spec2_1p1z_time_tilde_free(t_spec2_1p1z_time_tilde *x) { if(x->x_begmem_forw) freebytes(x->x_begmem_forw, 2 * (x->x_blocksize+1) * sizeof(t_float)); }
void spec2_1p1z_time_tilde_setup(void) { spec2_1p1z_time_tilde_class = class_new(gensym("spec2_1p1z_time~"), (t_newmethod)spec2_1p1z_time_tilde_new, (t_method)spec2_1p1z_time_tilde_free, sizeof(t_spec2_1p1z_time_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(spec2_1p1z_time_tilde_class, t_spec2_1p1z_time_tilde, x_msi); class_addlist(spec2_1p1z_time_tilde_class, (t_method)spec2_1p1z_time_tilde_list); class_addmethod(spec2_1p1z_time_tilde_class, (t_method)spec2_1p1z_time_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_1p1z_time_tilde_class, gensym("iemhelp2/spec2_1p1z_time~-help")); }
--- NEW FILE: spec2_sum~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* ------------------------ spec2_sum_tilde~ ------------------------- */
static t_class *spec2_sum_tilde_class;
typedef struct _spec2_sum_tilde { t_object x_obj; t_float x_msi; } t_spec2_sum_tilde;
static t_int *spec2_sum_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_float sum = 0.0f; int n, hn;
n = hn = w[3]; sum = *in++; while(n--) sum += (*in++)*2.0f; while(hn--) *out++ = sum; *out++ = sum; return(w+4); }
static t_int *spec2_sum_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_float sum=0.0f; int n, hn;
n = hn = w[3]; sum = *in++; while(n) { sum += 2.0f*in[0]; sum += 2.0f*in[1]; sum += 2.0f*in[2]; sum += 2.0f*in[3]; sum += 2.0f*in[4]; sum += 2.0f*in[5]; sum += 2.0f*in[6]; sum += 2.0f*in[7]; sum += 2.0f*in[8]; sum += 2.0f*in[9]; sum += 2.0f*in[10]; sum += 2.0f*in[11]; sum += 2.0f*in[12]; sum += 2.0f*in[13]; sum += 2.0f*in[14]; sum += 2.0f*in[15];
in += 16; n -= 16; }
while(hn) { out[0] = sum; out[1] = sum; out[2] = sum; out[3] = sum; out[4] = sum; out[5] = sum; out[6] = sum; out[7] = sum; out[8] = sum; out[9] = sum; out[10] = sum; out[11] = sum; out[12] = sum; out[13] = sum; out[14] = sum; out[15] = sum;
out += 16; hn -= 16; } out[0] = sum; return(w+4); }
static void spec2_sum_tilde_dsp(t_spec2_sum_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
if(n&15) dsp_add(spec2_sum_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); else dsp_add(spec2_sum_tilde_perf16, 3, sp[0]->s_vec, sp[0]->s_vec, n); }
static void *spec2_sum_tilde_new(void) { t_spec2_sum_tilde *x = (t_spec2_sum_tilde *)pd_new(spec2_sum_tilde_class);
outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); }
void spec2_sum_tilde_setup(void) { spec2_sum_tilde_class = class_new(gensym("spec2_sum~"), (t_newmethod)spec2_sum_tilde_new, 0, sizeof(t_spec2_sum_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_sum_tilde_class, t_spec2_sum_tilde, x_msi); class_addmethod(spec2_sum_tilde_class, (t_method)spec2_sum_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_sum_tilde_class, gensym("iemhelp2/spec2_sum~-help")); }
--- NEW FILE: spec2_shift~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* -- spec2_shift~ - shift spectral bins to left (lower, negative) or to right (higher, positiv) --- */
typedef struct spec2_shift_tilde { t_object x_obj; int x_blocksize; t_float x_add; t_float *x_spec; t_float x_msi; } t_spec2_shift_tilde;
t_class *spec2_shift_tilde_class;
static t_int *spec2_shift_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_shift_tilde *x = (t_spec2_shift_tilde *)(w[3]); int i, j, n = (t_int)(w[4])+1; t_float *spec=x->x_spec; t_float add=x->x_add;
if((add >= n) || (add <= -n)) { for(i=0; i<n; i++)/* clear residal of spec-buffer */ out[i] = 0.0f; } else { for(i=0; i<n; i++)/* copy spec into buffer */ spec[i] = in[i];
if(add >= 0) { for(i=0; i<add; i++)/* clear residal of spec-buffer */ out[i] = 0.0f; for(j=0; i<n; i++, j++)/* copy spec into buffer */ out[i] = spec[j]; } else { add *= -1; for(i=0, j=add; j<n; i++, j++)/* copy spec into buffer */ out[i] = spec[j]; for(; i<n; i++)/* clear residal of spec-buffer */ out[i] = 0.0f; } } return(w+5); }
static void spec2_shift_tilde_add(t_spec2_shift_tilde *x, t_floatarg add) { x->x_add = add; }
static void spec2_shift_tilde_dsp(t_spec2_shift_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
if(!x->x_blocksize) { x->x_spec = (t_float *)getbytes((n+1)*sizeof(t_float)); x->x_blocksize = n; } else if(x->x_blocksize != n) { x->x_spec = (t_float *)resizebytes(x->x_spec, (x->x_blocksize+1)*sizeof(t_float), (n+1)*sizeof(t_float)); x->x_blocksize = n; } dsp_add(spec2_shift_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); }
static void *spec2_shift_tilde_new(t_floatarg add) { t_spec2_shift_tilde *x = (t_spec2_shift_tilde *)pd_new(spec2_shift_tilde_class);
outlet_new(&x->x_obj, &s_signal); x->x_blocksize = 0; x->x_add = add; x->x_spec = (t_float *)0; return (x); }
static void spec2_shift_tilde_free(t_spec2_shift_tilde *x) { if(x->x_spec) freebytes(x->x_spec, (x->x_blocksize+1) * sizeof(t_float)); }
void spec2_shift_tilde_setup(void) { spec2_shift_tilde_class = class_new(gensym("spec2_shift~"), (t_newmethod)spec2_shift_tilde_new, 0, sizeof(t_spec2_shift_tilde), 0, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(spec2_shift_tilde_class, t_spec2_shift_tilde, x_msi); class_addmethod(spec2_shift_tilde_class, (t_method)spec2_shift_tilde_dsp, gensym("dsp"), 0); class_addfloat(spec2_shift_tilde_class, (t_method)spec2_shift_tilde_add); class_sethelpsymbol(spec2_shift_tilde_class, gensym("iemhelp/spec2_shift~-help")); }
--- NEW FILE: spec2_clip_max~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* -------------------------- spec2_clip_max~ ------------------------------ */ static t_class *spec2_clip_max_tilde_class;
typedef struct _spec2_clip_max_tilde { t_object x_obj; t_float x_msi; } t_spec2_clip_max_tilde;
static t_int *spec2_clip_max_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *max = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int i, n = (t_int)(w[4]);
for(i=0; i<=n; i++) { if(in[i] > max[i]) out[i] = max[i]; else out[i] = in[i]; } return(w+5); }
static t_int *spec2_clip_max_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *max = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (t_int)(w[4]);
while(n) { if(in[0] > max[0]) out[0] = max[0]; else out[0] = in[0];
if(in[1] > max[1]) out[1] = max[1]; else out[1] = in[1];
if(in[2] > max[2]) out[2] = max[2]; else out[2] = in[2];
if(in[3] > max[3]) out[3] = max[3]; else out[3] = in[3];
if(in[4] > max[4]) out[4] = max[4]; else out[4] = in[4];
if(in[5] > max[5]) out[5] = max[5]; else out[5] = in[5];
if(in[6] > max[6]) out[6] = max[6]; else out[6] = in[6];
if(in[7] > max[7]) out[7] = max[7]; else out[7] = in[7];
if(in[8] > max[8]) out[8] = max[8]; else out[8] = in[8];
if(in[9] > max[9]) out[9] = max[9]; else out[9] = in[9];
if(in[10] > max[10]) out[10] = max[10]; else out[10] = in[10];
if(in[11] > max[11]) out[11] = max[11]; else out[11] = in[11];
if(in[12] > max[12]) out[12] = max[12]; else out[12] = in[12];
if(in[13] > max[13]) out[13] = max[13]; else out[13] = in[13];
if(in[14] > max[14]) out[14] = max[14]; else out[14] = in[14];
if(in[15] > max[15]) out[15] = max[15]; else out[15] = in[15];
in += 16; max += 16; out += 16; n -= 16; } if(in[0] > max[0]) out[0] = max[0]; else out[0] = in[0]; return(w+5); }
static void spec2_clip_max_tilde_dsp(t_spec2_clip_max_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
if(n&15) dsp_add(spec2_clip_max_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); else dsp_add(spec2_clip_max_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); }
static void *spec2_clip_max_tilde_new(void) { t_spec2_clip_max_tilde *x = (t_spec2_clip_max_tilde *)pd_new(spec2_clip_max_tilde_class);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); }
static void spec2_clip_max_tilde_free(t_spec2_clip_max_tilde *x) { }
void spec2_clip_max_tilde_setup(void) { spec2_clip_max_tilde_class = class_new(gensym("spec2_clip_max~"), (t_newmethod)spec2_clip_max_tilde_new, (t_method)spec2_clip_max_tilde_free, sizeof(t_spec2_clip_max_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_clip_max_tilde_class, t_spec2_clip_max_tilde, x_msi); class_addmethod(spec2_clip_max_tilde_class, (t_method)spec2_clip_max_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_clip_max_tilde_class, gensym("iemhelp2/spec2_clip_max~-help")); }
--- NEW FILE: spec2_mul~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* -------------------------- spec2_mul~ ------------------------------ */ static t_class *spec2_mul_tilde_class;
typedef struct _spec2_mul_tilde { t_object x_obj; t_float x_msi; } t_spec2_mul_tilde;
static t_int *spec2_mul_tilde_perform(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int i, n = (t_int)(w[4]);
for(i=0; i<=n; i++) { out[i] = in1[i] * in2[i]; } return(w+5); }
static t_int *spec2_mul_tilde_perf16(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (t_int)(w[4]);
while(n) { out[0] = in1[0] * in2[0]; out[1] = in1[1] * in2[1]; out[2] = in1[2] * in2[2]; out[3] = in1[3] * in2[3]; out[4] = in1[4] * in2[4]; out[5] = in1[5] * in2[5]; out[6] = in1[6] * in2[6]; out[7] = in1[7] * in2[7]; out[8] = in1[8] * in2[8]; out[9] = in1[9] * in2[9]; out[10] = in1[10] * in2[10]; out[11] = in1[11] * in2[11]; out[12] = in1[12] * in2[12]; out[13] = in1[13] * in2[13]; out[14] = in1[14] * in2[14]; out[15] = in1[15] * in2[15];
in1 += 16; in2 += 16; out += 16; n -= 16; } out[0] = in1[0] * in2[0]; return(w+5); }
static void spec2_mul_tilde_dsp(t_spec2_mul_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
if(n&15) dsp_add(spec2_mul_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); else dsp_add(spec2_mul_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); }
static void *spec2_mul_tilde_new(void) { t_spec2_mul_tilde *x = (t_spec2_mul_tilde *)pd_new(spec2_mul_tilde_class);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); }
static void spec2_mul_tilde_free(t_spec2_mul_tilde *x) { }
void spec2_mul_tilde_setup(void) { spec2_mul_tilde_class = class_new(gensym("spec2_mul~"), (t_newmethod)spec2_mul_tilde_new, (t_method)spec2_mul_tilde_free, sizeof(t_spec2_mul_tilde), 0, 0); class_addcreator((t_newmethod)spec2_mul_tilde_new, gensym("spec2*~"), 0); CLASS_MAINSIGNALIN(spec2_mul_tilde_class, t_spec2_mul_tilde, x_msi); class_addmethod(spec2_mul_tilde_class, (t_method)spec2_mul_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_mul_tilde_class, gensym("iemhelp2/spec2_mul~-help")); }
--- NEW FILE: spec2_mul_scalar~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* -------------------------- spec2_mul_scalar~ ------------------------------ */ static t_class *spec2_mul_scalar_tilde_class;
typedef struct _spec2_mul_scalar_tilde { t_object x_obj; t_float x_f; t_float x_msi; } t_spec2_mul_scalar_tilde;
static void spec2_mul_scalar_tilde_ft1(t_spec2_mul_scalar_tilde *x, t_floatarg f) { x->x_f = f; }
static t_int *spec2_mul_scalar_tilde_perform(t_int *w) { t_float *io = (t_float *)(w[1]); t_spec2_mul_scalar_tilde *x = (t_spec2_mul_scalar_tilde *)(w[2]); int i, n = (t_int)(w[3]); t_float f = x->x_f;
for(i=0; i<=n; i++) { io[i] *= f; } return(w+4); }
static t_int *spec2_mul_scalar_tilde_perf16(t_int *w) { t_float *io = (t_float *)(w[1]); t_spec2_mul_scalar_tilde *x = (t_spec2_mul_scalar_tilde *)(w[2]); int n = (t_int)(w[3]); t_float f = x->x_f;
while(n) { io[0] *= f; io[1] *= f; io[2] *= f; io[3] *= f; io[4] *= f; io[5] *= f; io[6] *= f; io[7] *= f; io[8] *= f; io[9] *= f; io[10] *= f; io[11] *= f; io[12] *= f; io[13] *= f; io[14] *= f; io[15] *= f;
io += 16; n -= 16; } io[0] *= f; return(w+4); }
static void spec2_mul_scalar_tilde_dsp(t_spec2_mul_scalar_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
if(n&15) dsp_add(spec2_mul_scalar_tilde_perform, 3, sp[0]->s_vec, x, n); else dsp_add(spec2_mul_scalar_tilde_perf16, 3, sp[0]->s_vec, x, n); }
static void *spec2_mul_scalar_tilde_new(t_floatarg f) { t_spec2_mul_scalar_tilde *x = (t_spec2_mul_scalar_tilde *)pd_new(spec2_mul_scalar_tilde_class);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); outlet_new(&x->x_obj, &s_signal); x->x_f = f; x->x_msi = 0.0f; return (x); }
static void spec2_mul_scalar_tilde_free(t_spec2_mul_scalar_tilde *x) { }
void spec2_mul_scalar_tilde_setup(void) { spec2_mul_scalar_tilde_class = class_new(gensym("spec2_mul_scalar~"), (t_newmethod)spec2_mul_scalar_tilde_new, (t_method)spec2_mul_scalar_tilde_free, sizeof(t_spec2_mul_scalar_tilde), 0, A_DEFFLOAT, 0); class_addcreator((t_newmethod)spec2_mul_scalar_tilde_new, gensym("spec2*s~"), A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(spec2_mul_scalar_tilde_class, t_spec2_mul_scalar_tilde, x_msi); class_addmethod(spec2_mul_scalar_tilde_class, (t_method)spec2_mul_scalar_tilde_ft1, gensym("ft1"), A_FLOAT, 0); class_addmethod(spec2_mul_scalar_tilde_class, (t_method)spec2_mul_scalar_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_mul_scalar_tilde_class, gensym("iemhelp2/spec2_mul_scalar~-help")); }
--- NEW FILE: iem_spec2.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h"
static t_class *iem_spec2_class;
static void *iem_spec2_new(void) { t_object *x = (t_object *)pd_new(iem_spec2_class);
return (x); }
void spec2_1p1z_freq_tilde_setup(void); void spec2_1p1z_time_tilde_setup(void); void spec2_abs_tilde_setup(void); void spec2_add_scalar_tilde_setup(void); void spec2_add_tilde_setup(void); void spec2_block_delay_tilde_setup(void); void spec2_clip_max_tilde_setup(void); void spec2_clip_min_tilde_setup(void); void spec2_dbtopow_tilde_setup(void); void spec2_dbtorms_tilde_setup(void); void spec2_matrix_bundle_stat_tilde_setup(void); void spec2_mul_scalar_tilde_setup(void); void spec2_mul_tilde_setup(void); void spec2_powtodb_tilde_setup(void); void spec2_rmstodb_tilde_setup(void); void spec2_shift_tilde_setup(void); void spec2_sqrt_tilde_setup(void); void spec2_stretch_tilde_setup(void); void spec2_sub_tilde_setup(void); void spec2_sum_tilde_setup(void); void spec2_tab_conv_tilde_setup(void); void spec2_tabreceive_enable_tilde_setup(void); void spec2_tabreceive_tilde_setup(void);
/* ------------------------ setup routine ------------------------- */
void iem_spec2_setup(void) { iem_spec2_class = class_new(gensym("iem_spec2"), iem_spec2_new, 0, sizeof(t_object), CLASS_NOINLET, 0);
spec2_1p1z_freq_tilde_setup(); spec2_1p1z_time_tilde_setup(); spec2_abs_tilde_setup(); spec2_add_scalar_tilde_setup(); spec2_add_tilde_setup(); spec2_block_delay_tilde_setup(); spec2_clip_max_tilde_setup(); spec2_clip_min_tilde_setup(); spec2_dbtopow_tilde_setup(); spec2_dbtorms_tilde_setup(); spec2_matrix_bundle_stat_tilde_setup(); spec2_mul_scalar_tilde_setup(); spec2_mul_tilde_setup(); spec2_powtodb_tilde_setup(); spec2_rmstodb_tilde_setup(); spec2_shift_tilde_setup(); spec2_sqrt_tilde_setup(); spec2_stretch_tilde_setup(); spec2_sub_tilde_setup(); spec2_sum_tilde_setup(); spec2_tab_conv_tilde_setup(); spec2_tabreceive_enable_tilde_setup(); spec2_tabreceive_tilde_setup();
post("iem_spec2 (R-1.16) library loaded! (c) Thomas Musil 05.2005"); post(" musil%ciem.at iem KUG Graz Austria", '@'); }
--- NEW FILE: spec2_add_scalar~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* -------------------------- spec2_add_scalar~ ------------------------------ */ static t_class *spec2_add_scalar_tilde_class;
typedef struct _spec2_add_scalar_tilde { t_object x_obj; t_float x_f; t_float x_msi; } t_spec2_add_scalar_tilde;
static void spec2_add_scalar_tilde_ft1(t_spec2_add_scalar_tilde *x, t_floatarg f) { x->x_f = f; }
static t_int *spec2_add_scalar_tilde_perform(t_int *w) { t_float *io = (t_float *)(w[1]); t_spec2_add_scalar_tilde *x = (t_spec2_add_scalar_tilde *)(w[2]); int i, n = (t_int)(w[3]); t_float f = x->x_f;
for(i=0; i<=n; i++) { io[i] += f; } return(w+4); }
static t_int *spec2_add_scalar_tilde_perf16(t_int *w) { t_float *io = (t_float *)(w[1]); t_spec2_add_scalar_tilde *x = (t_spec2_add_scalar_tilde *)(w[2]); int n = (t_int)(w[3]); t_float f = x->x_f;
while(n) { io[0] += f; io[1] += f; io[2] += f; io[3] += f; io[4] += f; io[5] += f; io[6] += f; io[7] += f; io[8] += f; io[9] += f; io[10] += f; io[11] += f; io[12] += f; io[13] += f; io[14] += f; io[15] += f;
io += 16; n -= 16; } io[0] += f; return(w+4); }
static void spec2_add_scalar_tilde_dsp(t_spec2_add_scalar_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
if(n&15) dsp_add(spec2_add_scalar_tilde_perform, 3, sp[0]->s_vec, x, n); else dsp_add(spec2_add_scalar_tilde_perf16, 3, sp[0]->s_vec, x, n); }
static void *spec2_add_scalar_tilde_new(t_floatarg f) { t_spec2_add_scalar_tilde *x = (t_spec2_add_scalar_tilde *)pd_new(spec2_add_scalar_tilde_class);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); outlet_new(&x->x_obj, &s_signal); x->x_f = f; x->x_msi = 0.0f; return (x); }
static void spec2_add_scalar_tilde_free(t_spec2_add_scalar_tilde *x) { }
void spec2_add_scalar_tilde_setup(void) { spec2_add_scalar_tilde_class = class_new(gensym("spec2_add_scalar~"), (t_newmethod)spec2_add_scalar_tilde_new, (t_method)spec2_add_scalar_tilde_free, sizeof(t_spec2_add_scalar_tilde), 0, A_DEFFLOAT, 0); class_addcreator((t_newmethod)spec2_add_scalar_tilde_new, gensym("spec2+s~"), A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(spec2_add_scalar_tilde_class, t_spec2_add_scalar_tilde, x_msi); class_addmethod(spec2_add_scalar_tilde_class, (t_method)spec2_add_scalar_tilde_ft1, gensym("ft1"), A_FLOAT, 0); class_addmethod(spec2_add_scalar_tilde_class, (t_method)spec2_add_scalar_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_add_scalar_tilde_class, gensym("iemhelp2/spec2_add_scalar~-help")); }
--- NEW FILE: spec2_tabreceive~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil (c) IEM KUG Graz Austria 2002 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* ------------------------ spec2_tabreceive_tilde~ ------------------------- */
static t_class *spec2_tabreceive_tilde_class;
typedef struct _spec2_tabreceive_tilde { t_object x_obj; t_float *x_vec; t_symbol *x_arrayname; } t_spec2_tabreceive_tilde;
static void spec2_tabreceive_tilde_symbol(t_spec2_tabreceive_tilde *x, t_symbol *s) { x->x_arrayname = s; }
static t_int *spec2_tabreceive_tilde_perform(t_int *w) { t_spec2_tabreceive_tilde *x = (t_spec2_tabreceive_tilde *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1; t_float *vec = x->x_vec;
if(vec) while(n--) *out++ = *vec++; else while(n--) *out++ = 0.0f; return(w+4); }
static t_int *spec2_tabreceive_tilde_perf16(t_int *w) { t_spec2_tabreceive_tilde *x = (t_spec2_tabreceive_tilde *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]; t_float *vec = x->x_vec;
if(vec) { while(n) { out[0] = vec[0]; out[1] = vec[1]; out[2] = vec[2]; out[3] = vec[3]; out[4] = vec[4]; out[5] = vec[5]; out[6] = vec[6]; out[7] = vec[7]; out[8] = vec[8]; out[9] = vec[9]; out[10] = vec[10]; out[11] = vec[11]; out[12] = vec[12]; out[13] = vec[13]; out[14] = vec[14]; out[15] = vec[15];
vec += 16; out += 16; n -= 16; } out[0] = vec[0]; } else { while(n) { out[0] = 0.0f; out[1] = 0.0f; out[2] = 0.0f; out[3] = 0.0f; out[4] = 0.0f; out[5] = 0.0f; out[6] = 0.0f; out[7] = 0.0f; out[8] = 0.0f; out[9] = 0.0f; out[10] = 0.0f; out[11] = 0.0f; out[12] = 0.0f; out[13] = 0.0f; out[14] = 0.0f; out[15] = 0.0f;
out += 16; n -= 16; } out[0] = 0.0f; }
return(w+4); }
static void spec2_tabreceive_tilde_dsp(t_spec2_tabreceive_tilde *x, t_signal **sp) { t_garray *a; int vecsize;
if(!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) { if(*x->x_arrayname->s_name) error("spec2_tabreceive~: %s: no such array", x->x_arrayname->s_name); } else if(!garray_getfloatarray(a, &vecsize, &x->x_vec)) error("%s: bad template for spec2_tabreceive~", x->x_arrayname->s_name); else { int n = sp[0]->s_n;
if(n < vecsize) vecsize = n; vecsize /= 2; if(vecsize&15) dsp_add(spec2_tabreceive_tilde_perform, 3, x, sp[0]->s_vec, vecsize); else dsp_add(spec2_tabreceive_tilde_perf16, 3, x, sp[0]->s_vec, vecsize); } }
static void *spec2_tabreceive_tilde_new(t_symbol *s) { t_spec2_tabreceive_tilde *x = (t_spec2_tabreceive_tilde *)pd_new(spec2_tabreceive_tilde_class);
x->x_arrayname = s; outlet_new(&x->x_obj, &s_signal); return (x); }
void spec2_tabreceive_tilde_setup(void) { spec2_tabreceive_tilde_class = class_new(gensym("spec2_tabreceive~"), (t_newmethod)spec2_tabreceive_tilde_new, 0, sizeof(t_spec2_tabreceive_tilde), 0, A_DEFSYM, 0); class_addmethod(spec2_tabreceive_tilde_class, (t_method)spec2_tabreceive_tilde_dsp, gensym("dsp"), 0); class_addsymbol(spec2_tabreceive_tilde_class, (t_method)spec2_tabreceive_tilde_symbol); class_sethelpsymbol(spec2_tabreceive_tilde_class, gensym("iemhelp/spec2_tabreceive~-help")); }
--- NEW FILE: spec2_1p1z_freq~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* -- spec2_1p1z_freq~ - filter the spectrum with a 1.order IIR twice, once forwards, once backwards --- */
typedef struct spec2_1p1z_freq_tilde { t_object x_obj; t_float x_a0; t_float x_a1; t_float x_b1; t_float *x_begmem; int x_blocksize; t_float x_msi; } t_spec2_1p1z_freq_tilde;
t_class *spec2_1p1z_freq_tilde_class;
static void spec2_1p1z_freq_tilde_list(t_spec2_1p1z_freq_tilde *x, t_symbol *s, int argc, t_atom *argv) { if((argc >= 3) && IS_A_FLOAT(argv,0) && IS_A_FLOAT(argv,1) && IS_A_FLOAT(argv,2)) { x->x_a0 = (t_float)atom_getfloatarg(0, argc, argv); x->x_a1 = (t_float)atom_getfloatarg(1, argc, argv); x->x_b1 = (t_float)atom_getfloatarg(2, argc, argv); } }
static t_int *spec2_1p1z_freq_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_1p1z_freq_tilde *x = (t_spec2_1p1z_freq_tilde *)(w[3]); int i, m, n = (int)(w[4]); t_float a0 = x->x_a0; t_float a1 = x->x_a1; t_float b1 = x->x_b1; t_float *vec1, *vec2, *vec3; t_float in_old, out_old, f;
vec2 = x->x_begmem + n + 1; vec1 = vec2 - 1; vec3 = vec2 + 2*n;
*vec2++ = in[0]; for(i=1; i<n; i++) { f = in[i]; *vec2++ = f; *vec1-- = f; *vec3-- = f; } *vec2 = in[n];
m = 3*n - 1;
vec2 = x->x_begmem + 2; in_old = 0.0f; out_old = 0.0f; for(i=0; i<m; i++) { f = *vec2; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; *vec2++ = out_old; }
vec2 = x->x_begmem + 3*n - 2; in_old = 0.0f; out_old = 0.0f; for(i=0; i<m; i++) { f = *vec2; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; *vec2-- = out_old; }
vec2 = x->x_begmem + n + 1; for(i=0; i<=n; i++) { out[i] = *vec2++; }
return(w+5); }
static t_int *spec2_1p1z_freq_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_spec2_1p1z_freq_tilde *x = (t_spec2_1p1z_freq_tilde *)(w[3]); int i, m, n = (int)(w[4]); t_float a0 = x->x_a0; t_float a1 = x->x_a1; t_float b1 = x->x_b1; t_float *vec1, *vec2, *vec3; t_float in_old, out_old, f;
m = 3*n;
vec2 = x->x_begmem + n + 1; vec1 = vec2; // vec3 = vec2 + 2*n + 2 - 2; vec3 = vec2 + 2*n;
x->x_begmem[0] = 0.0f; x->x_begmem[m-1] = 0.0f;
i = n; while(i) { f = in[0]; vec2[0] = f; vec1[0] = f; vec3[0] = f;
f = in[1]; vec2[1] = f; vec1[-1] = f; vec3[-1] = f;
f = in[2]; vec2[2] = f; vec1[-2] = f; vec3[-2] = f;
f = in[3]; vec2[3] = f; vec1[-3] = f; vec3[-3] = f;
f = in[4]; vec2[4] = f; vec1[-4] = f; vec3[-4] = f;
f = in[5]; vec2[5] = f; vec1[-5] = f; vec3[-5] = f;
f = in[6]; vec2[6] = f; vec1[-6] = f; vec3[-6] = f;
f = in[7]; vec2[7] = f; vec1[-7] = f; vec3[-7] = f;
f = in[8]; vec2[8] = f; vec1[-8] = f; vec3[-8] = f;
f = in[9]; vec2[9] = f; vec1[-9] = f; vec3[-9] = f;
f = in[10]; vec2[10] = f; vec1[-10] = f; vec3[-10] = f;
f = in[11]; vec2[11] = f; vec1[-11] = f; vec3[-11] = f;
f = in[12]; vec2[12] = f; vec1[-12] = f; vec3[-12] = f;
f = in[13]; vec2[13] = f; vec1[-13] = f; vec3[-13] = f;
f = in[14]; vec2[14] = f; vec1[-14] = f; vec3[-14] = f;
f = in[15]; vec2[15] = f; vec1[-15] = f; vec3[-15] = f;
in += 16; vec1 -= 16; vec2 += 16; vec3 -= 16; i -= 16; } f = in[0]; vec2[0] = f; vec1[0] = f; vec3[0] = f;
vec2 = x->x_begmem; in_old = 0.0f; out_old = 0.0f; i = m; while(i) { f = vec2[0]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[0] = out_old;
f = vec2[1]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[1] = out_old;
f = vec2[2]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[2] = out_old;
f = vec2[3]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[3] = out_old;
f = vec2[4]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[4] = out_old;
f = vec2[5]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[5] = out_old;
f = vec2[6]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[6] = out_old;
f = vec2[7]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[7] = out_old;
f = vec2[8]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[8] = out_old;
f = vec2[9]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[9] = out_old;
f = vec2[10]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[10] = out_old;
f = vec2[11]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[11] = out_old;
f = vec2[12]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[12] = out_old;
f = vec2[13]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[13] = out_old;
f = vec2[14]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[14] = out_old;
f = vec2[15]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[15] = out_old;
vec2 += 16; i -= 16; } f = vec2[0]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[0] = out_old;
f = vec2[1]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[1] = out_old;
f = vec2[2]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[2] = out_old;
// vec2 = x->x_begmem + 3*n - 1 + 3; vec2 = x->x_begmem + 3*n + 2; in_old = 0.0f; out_old = 0.0f; for(i=0; i<m; ) { f = vec2[0]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[0] = out_old;
f = vec2[-1]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-1] = out_old;
f = vec2[-2]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-2] = out_old;
f = vec2[-3]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-3] = out_old;
f = vec2[-4]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-4] = out_old;
f = vec2[-5]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-5] = out_old;
f = vec2[-6]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-6] = out_old;
f = vec2[-7]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-7] = out_old;
f = vec2[-8]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-8] = out_old;
f = vec2[-9]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-9] = out_old;
f = vec2[-10]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-10] = out_old;
f = vec2[-11]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-11] = out_old;
f = vec2[-12]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-12] = out_old;
f = vec2[-13]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-13] = out_old;
f = vec2[-14]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-14] = out_old;
f = vec2[-15]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-15] = out_old;
vec2 -= 16; i -= 16; } f = vec2[0]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[0] = out_old;
f = vec2[-1]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-1] = out_old;
f = vec2[-2]; out_old = a0*f + a1*in_old + b1*out_old; in_old = f; vec2[-2] = out_old;
vec2 = x->x_begmem + n + 1; i = n; while(i) { out[0] = vec2[0]; out[1] = vec2[1]; out[2] = vec2[2]; out[3] = vec2[3]; out[4] = vec2[4]; out[5] = vec2[5]; out[6] = vec2[6]; out[7] = vec2[7]; out[8] = vec2[8]; out[9] = vec2[9]; out[10] = vec2[10]; out[11] = vec2[11]; out[12] = vec2[12]; out[13] = vec2[13]; out[14] = vec2[14]; out[15] = vec2[15];
vec2 += 16; out += 16; i -= 16; } out[0] = vec2[0];
return(w+5); }
static void spec2_1p1z_freq_tilde_dsp(t_spec2_1p1z_freq_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
if(!x->x_blocksize) { x->x_begmem = (t_float *)getbytes(3*(n+1)*sizeof(t_float)); x->x_blocksize = n; } else if(x->x_blocksize != n) { x->x_begmem = (t_float *)resizebytes(x->x_begmem, 3*(x->x_blocksize+1)*sizeof(t_float), 3*(n+1)*sizeof(t_float)); x->x_blocksize = n; }
if(n&15) dsp_add(spec2_1p1z_freq_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); else dsp_add(spec2_1p1z_freq_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); }
static void spec2_1p1z_freq_tilde_free(t_spec2_1p1z_freq_tilde *x) { if(x->x_begmem) freebytes(x->x_begmem, 3*(x->x_blocksize+1)*sizeof(t_float)); }
static void *spec2_1p1z_freq_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_spec2_1p1z_freq_tilde *x = (t_spec2_1p1z_freq_tilde *)pd_new(spec2_1p1z_freq_tilde_class);
outlet_new(&x->x_obj, &s_signal); x->x_blocksize = 0; x->x_begmem = (t_float *)0; if(argc >= 3) spec2_1p1z_freq_tilde_list(x, s, argc, argv); else { x->x_a0 = 1.0f; x->x_a1 = 0.0f; x->x_b1 = 0.0f; } x->x_msi = 0.0f; return (x); }
void spec2_1p1z_freq_tilde_setup(void) { spec2_1p1z_freq_tilde_class = class_new(gensym("spec2_1p1z_freq~"), (t_newmethod)spec2_1p1z_freq_tilde_new, (t_method)spec2_1p1z_freq_tilde_free, sizeof(t_spec2_1p1z_freq_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(spec2_1p1z_freq_tilde_class, t_spec2_1p1z_freq_tilde, x_msi); class_addmethod(spec2_1p1z_freq_tilde_class, (t_method)spec2_1p1z_freq_tilde_dsp, gensym("dsp"), 0); class_addlist(spec2_1p1z_freq_tilde_class, (t_method)spec2_1p1z_freq_tilde_list); class_sethelpsymbol(spec2_1p1z_freq_tilde_class, gensym("iemhelp2/spec2_1p1z_freq~-help")); }
--- NEW FILE: spec2_dbtopow~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
#define SPEC2LOGTEN 2.302585092994f
/* ------------------------ spec2_dbtopow_tilde~ ------------------------- */
static t_class *spec2_dbtopow_tilde_class;
typedef struct _spec2_dbtopow_tilde { t_object x_obj; t_float x_msi; } t_spec2_dbtopow_tilde;
static t_int *spec2_dbtopow_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); int n = w[3]+1;
for (; n--; in++, out++) { t_float f = *in;
if(f <= 0.0f) *out = 0.0f; else { if(f > 870.0f) f = 870.0f; *out = exp((SPEC2LOGTEN * 0.1f) * (f-100.0f)); } } return(w+4); }
static void spec2_dbtopow_tilde_dsp(t_spec2_dbtopow_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
dsp_add(spec2_dbtopow_tilde_perform, 3, sp[0]->s_vec, sp[0]->s_vec, n); }
static void *spec2_dbtopow_tilde_new(void) { t_spec2_dbtopow_tilde *x = (t_spec2_dbtopow_tilde *)pd_new(spec2_dbtopow_tilde_class);
outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); }
void spec2_dbtopow_tilde_setup(void) { spec2_dbtopow_tilde_class = class_new(gensym("spec2_dbtopow~"), (t_newmethod)spec2_dbtopow_tilde_new, 0, sizeof(t_spec2_dbtopow_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_dbtopow_tilde_class, t_spec2_dbtopow_tilde, x_msi); class_addmethod(spec2_dbtopow_tilde_class, (t_method)spec2_dbtopow_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_dbtopow_tilde_class, gensym("iemhelp2/spec2_dbtopow~-help")); }
--- NEW FILE: spec2_add~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* -------------------------- spec2_add~ ------------------------------ */ static t_class *spec2_add_tilde_class;
typedef struct _spec2_add_tilde { t_object x_obj; t_float x_msi; } t_spec2_add_tilde;
static t_int *spec2_add_tilde_perform(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int i, n = (t_int)(w[4]);
for(i=0; i<=n; i++) { out[i] = in1[i] + in2[i]; } return(w+5); }
static t_int *spec2_add_tilde_perf16(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (t_int)(w[4]);
while(n) { out[0] = in1[0] + in2[0]; out[1] = in1[1] + in2[1]; out[2] = in1[2] + in2[2]; out[3] = in1[3] + in2[3]; out[4] = in1[4] + in2[4]; out[5] = in1[5] + in2[5]; out[6] = in1[6] + in2[6]; out[7] = in1[7] + in2[7]; out[8] = in1[8] + in2[8]; out[9] = in1[9] + in2[9]; out[10] = in1[10] + in2[10]; out[11] = in1[11] + in2[11]; out[12] = in1[12] + in2[12]; out[13] = in1[13] + in2[13]; out[14] = in1[14] + in2[14]; out[15] = in1[15] + in2[15];
in1 += 16; in2 += 16; out += 16; n -= 16; } out[0] = in1[0] + in2[0]; return(w+5); }
static void spec2_add_tilde_dsp(t_spec2_add_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
if(n&15) dsp_add(spec2_add_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); else dsp_add(spec2_add_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); }
static void *spec2_add_tilde_new(void) { t_spec2_add_tilde *x = (t_spec2_add_tilde *)pd_new(spec2_add_tilde_class);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); }
static void spec2_add_tilde_free(t_spec2_add_tilde *x) { }
void spec2_add_tilde_setup(void) { spec2_add_tilde_class = class_new(gensym("spec2_add~"), (t_newmethod)spec2_add_tilde_new, (t_method)spec2_add_tilde_free, sizeof(t_spec2_add_tilde), 0, 0); class_addcreator((t_newmethod)spec2_add_tilde_new, gensym("spec2+~"), 0); CLASS_MAINSIGNALIN(spec2_add_tilde_class, t_spec2_add_tilde, x_msi); class_addmethod(spec2_add_tilde_class, (t_method)spec2_add_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_add_tilde_class, gensym("iemhelp2/spec2_add~-help")); }
--- NEW FILE: spec2_clip_min~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iem_spec2 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 */
#include "m_pd.h" #include "iemlib.h"
/* -------------------------- spec2_clip_min~ ------------------------------ */ static t_class *spec2_clip_min_tilde_class;
typedef struct _spec2_clip_min_tilde { t_object x_obj; t_float x_msi; } t_spec2_clip_min_tilde;
static t_int *spec2_clip_min_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *min = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int i, n = (t_int)(w[4]);
for(i=0; i<=n; i++) { if(in[i] < min[i]) out[i] = min[i]; else out[i] = in[i]; } return(w+5); }
static t_int *spec2_clip_min_tilde_perf16(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *min = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); int n = (t_int)(w[4]);
while(n) { if(in[0] < min[0]) out[0] = min[0]; else out[0] = in[0];
if(in[1] < min[1]) out[1] = min[1]; else out[1] = in[1];
if(in[2] < min[2]) out[2] = min[2]; else out[2] = in[2];
if(in[3] < min[3]) out[3] = min[3]; else out[3] = in[3];
if(in[4] < min[4]) out[4] = min[4]; else out[4] = in[4];
if(in[5] < min[5]) out[5] = min[5]; else out[5] = in[5];
if(in[6] < min[6]) out[6] = min[6]; else out[6] = in[6];
if(in[7] < min[7]) out[7] = min[7]; else out[7] = in[7];
if(in[8] < min[8]) out[8] = min[8]; else out[8] = in[8];
if(in[9] < min[9]) out[9] = min[9]; else out[9] = in[9];
if(in[10] < min[10]) out[10] = min[10]; else out[10] = in[10];
if(in[11] < min[11]) out[11] = min[11]; else out[11] = in[11];
if(in[12] < min[12]) out[12] = min[12]; else out[12] = in[12];
if(in[13] < min[13]) out[13] = min[13]; else out[13] = in[13];
if(in[14] < min[14]) out[14] = min[14]; else out[14] = in[14];
if(in[15] < min[15]) out[15] = min[15]; else out[15] = in[15];
in += 16; min += 16; out += 16; n -= 16; } if(in[0] < min[0]) out[0] = min[0]; else out[0] = in[0]; return(w+5); }
static void spec2_clip_min_tilde_dsp(t_spec2_clip_min_tilde *x, t_signal **sp) { int n = (sp[0]->s_n)/2;
if(n&15) dsp_add(spec2_clip_min_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); else dsp_add(spec2_clip_min_tilde_perf16, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, n); }
static void *spec2_clip_min_tilde_new(void) { t_spec2_clip_min_tilde *x = (t_spec2_clip_min_tilde *)pd_new(spec2_clip_min_tilde_class);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); }
static void spec2_clip_min_tilde_free(t_spec2_clip_min_tilde *x) { }
void spec2_clip_min_tilde_setup(void) { spec2_clip_min_tilde_class = class_new(gensym("spec2_clip_min~"), (t_newmethod)spec2_clip_min_tilde_new, (t_method)spec2_clip_min_tilde_free, sizeof(t_spec2_clip_min_tilde), 0, 0); CLASS_MAINSIGNALIN(spec2_clip_min_tilde_class, t_spec2_clip_min_tilde, x_msi); class_addmethod(spec2_clip_min_tilde_class, (t_method)spec2_clip_min_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(spec2_clip_min_tilde_class, gensym("iemhelp2/spec2_clip_min~-help")); }