diff options
Diffstat (limited to 'pd/extra/paf~')
-rw-r--r-- | pd/extra/paf~/README.txt | 12 | ||||
-rw-r--r-- | pd/extra/paf~/makefile | 97 | ||||
-rw-r--r-- | pd/extra/paf~/paf~.c | 927 |
3 files changed, 0 insertions, 1036 deletions
diff --git a/pd/extra/paf~/README.txt b/pd/extra/paf~/README.txt deleted file mode 100644 index 9bd41879..00000000 --- a/pd/extra/paf~/README.txt +++ /dev/null @@ -1,12 +0,0 @@ -Paf is copyright (C) 1999 Miller Puckette. -Permission is granted to use this software for any purpose, commercial -or noncommercial, as long as this notice is included with all copies. - -NEITHER THE AUTHORS NOR THEIR EMPLOYERS MAKE ANY WARRANTY, EXPRESS OR IMPLIED, -IN CONNECTION WITH THIS SOFTWARE! - ----------------------------------------------------------------------------- - -This is the README file for the "paf" percussion detector. This software -is available from http://www.crca.ucsd.edu/~msp as part of the "toys" -library. - msp@ucsd.edu diff --git a/pd/extra/paf~/makefile b/pd/extra/paf~/makefile deleted file mode 100644 index cb06b555..00000000 --- a/pd/extra/paf~/makefile +++ /dev/null @@ -1,97 +0,0 @@ -NAME=paf~ -CSYM=paf_tilde - -current: pd_linux - -# ----------------------- NT ----------------------- - -pd_nt: $(NAME).dll - -.SUFFIXES: .dll - -PDNTCFLAGS = /W3 /WX /DNT /DPD /nologo -VC="C:\Program Files\Microsoft Visual Studio\Vc98" - -PDNTINCLUDE = /I. /I\tcl\include /I\ftp\pd\src /I$(VC)\include - -PDNTLDIR = $(VC)\lib -PDNTLIB = $(PDNTLDIR)\libc.lib \ - $(PDNTLDIR)\oldnames.lib \ - $(PDNTLDIR)\kernel32.lib \ - \ftp\pd\bin\pd.lib - -.c.dll: - cl $(PDNTCFLAGS) $(PDNTINCLUDE) /c $*.c - link /dll /export:$(CSYM)_setup $*.obj $(PDNTLIB) - -# ----------------------- IRIX 5.x ----------------------- - -pd_irix5: $(NAME).pd_irix5 - -.SUFFIXES: .pd_irix5 - -SGICFLAGS5 = -o32 -DPD -DUNIX -DIRIX -O2 - -SGIINCLUDE = -I../../src - -.c.pd_irix5: - cc $(SGICFLAGS5) $(SGIINCLUDE) -o $*.o -c $*.c - ld -elf -shared -rdata_shared -o $*.pd_irix5 $*.o - rm -f $*.o ../$*.pd_linux - ln -s $*.pd_linux .. - -# ----------------------- IRIX 6.x ----------------------- - -pd_irix6: $(NAME).pd_irix6 - -.SUFFIXES: .pd_irix6 - -SGICFLAGS6 = -n32 -DPD -DUNIX -DIRIX -DN32 -woff 1080,1064,1185 \ - -OPT:roundoff=3 -OPT:IEEE_arithmetic=3 -OPT:cray_ivdep=true \ - -Ofast=ip32 - -.c.pd_irix6: - cc $(SGICFLAGS6) $(SGIINCLUDE) -o $*.o -c $*.c - ld -n32 -IPA -shared -rdata_shared -o $*.pd_irix6 $*.o - rm $*.o - -# ----------------------- LINUX i386 ----------------------- - -pd_linux: $(NAME).pd_linux - -.SUFFIXES: .pd_linux - -LINUXCFLAGS = -fPIC -DPD -O2 -funroll-loops -fomit-frame-pointer \ - -Wall -W -Wshadow -Wstrict-prototypes -Werror \ - -Wno-unused -Wno-parentheses -Wno-switch - -LINUXINCLUDE = -I../../src - -LSTRIP = strip --strip-unneeded -R .note -R .comment - -.c.pd_linux: - cc $(LINUXCFLAGS) $(LINUXINCLUDE) -o $*.o -c $*.c - cc -Wl,-export_dynamic --shared -o $*.pd_linux $*.o -lm - $(LSTRIP) $*.pd_linux - rm -f $*.o ../$*.pd_linux - ln -s $*/$*.pd_linux .. - -# ----------------------- Mac OSX ----------------------- - -pd_darwin: $(NAME).pd_darwin - -.SUFFIXES: .pd_darwin - -DARWINCFLAGS = -DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \ - -Wno-unused -Wno-parentheses -Wno-switch - -.c.pd_darwin: - cc $(DARWINCFLAGS) $(LINUXINCLUDE) -o $*.o -c $*.c - cc -bundle -undefined suppress -flat_namespace -o $*.pd_darwin $*.o - rm -f $*.o ../$*.pd_darwin - ln -s $*/$*.pd_darwin .. - -# ---------------------------------------------------------- - -clean: - rm -f *.o *.pd_* so_locations diff --git a/pd/extra/paf~/paf~.c b/pd/extra/paf~/paf~.c deleted file mode 100644 index 4a1fec07..00000000 --- a/pd/extra/paf~/paf~.c +++ /dev/null @@ -1,927 +0,0 @@ -/* paf -- version of the paf generator derived from "jupiterpaf", from -Manoury's Jupiter, 1997 version. Can be compiled as a standalone test program, -or as an object in Max 0.26, JMAX, or Pd. */ - -/* Copyright 1997-1999 Miller Puckette. -Permission is granted to use this software for any purpose provided you -keep this copyright notice intact. - -THE AUTHOR AND HIS EMPLOYERS MAKE NO WARRANTY, EXPRESS OR IMPLIED, -IN CONNECTION WITH THIS SOFTWARE. - -This file is downloadable from http://www.crca.ucsd.edu/~msp . - -Warning: the algorithms implemented here are covered by patents held by -IRCAM. While this probably does not restrict anyone from distributing -software implementing the paf, any hardware implementor should obtain a -license from IRCAM. -*/ - -static char *paf_version = "paf version 0.06"; - -#ifdef NT -#pragma warning (disable: 4305 4244) -#endif - -#ifdef TESTME -#include <stdio.h> -#endif -#ifdef FTS15 -#include "mess.h" -#include "dsp.h" -#endif -#ifdef V26SGI -#include "m_extern.h" -#include "d_graph.h" -#include "d_ugen.h" -#endif -#ifdef PD -#include "m_pd.h" -#endif -#include <math.h> - -#define LOGTABSIZE 9 -#define TABSIZE (1 << LOGTABSIZE) -#define TABRANGE 3 - -typedef struct _tabpoint -{ - float p_y; - float p_diff; -} t_tabpoint; - -static t_tabpoint paf_gauss[TABSIZE]; -static t_tabpoint paf_cauchy[TABSIZE]; - -typedef struct _linenv -{ - double l_current; - double l_biginc; - float l_1overn; - float l_target; - float l_msectodsptick; - int l_ticks; -} t_linenv; - -typedef struct _pafctl -{ - t_linenv x_freqenv; - t_linenv x_cfenv; - t_linenv x_bwenv; - t_linenv x_ampenv; - t_linenv x_vibenv; - t_linenv x_vfrenv; - t_linenv x_shiftenv; - float x_isr; - float x_held_freq; - float x_held_intcar; - float x_held_fraccar; - float x_held_bwquotient; - double x_phase; - double x_shiftphase; - double x_vibphase; - int x_triggerme; - int x_cauchy; -} t_pafctl; - -static void linenv_debug(t_linenv *l, char *s) -{ -#ifdef DEBUG - post("%s: current %f, target %f", s, l->l_current, l->l_target); -#endif -} - -static void linenv_init(t_linenv *l) -{ - l->l_current = l->l_biginc = 0; - l->l_1overn = l->l_target = l->l_msectodsptick = 0; - l->l_ticks = 0; -} - -static void linenv_setsr(t_linenv *l, float sr, int vecsize) -{ - l->l_msectodsptick = sr / (1000.f * ((float)vecsize)); - l->l_1overn = 1.f/(float)vecsize; -} - -static void linenv_set(t_linenv *l, float target, long timdel) -{ - if (timdel > 0) - { - l->l_ticks = ((float)timdel) * l->l_msectodsptick; - if (!l->l_ticks) l->l_ticks = 1; - l->l_target = target; - l->l_biginc = (l->l_target - l->l_current)/l->l_ticks; - } - else - { - l->l_ticks = 0; - l->l_current = l->l_target = target; - l->l_biginc = 0; - } -} - -#define LINENV_RUN(linenv, current, incr) \ - if (linenv.l_ticks > 0) \ - { \ - current = linenv.l_current; \ - incr = linenv.l_biginc * linenv.l_1overn; \ - linenv.l_ticks--; \ - linenv.l_current += linenv.l_biginc; \ - } \ - else \ - { \ - linenv.l_current = current = linenv.l_target; \ - incr = 0; \ - } - -#define UNITBIT32 1572864. /* 3*2^19 -- bit 32 has value 1 */ -#define TABFRACSHIFT (UNITBIT32/TABSIZE) - -#ifdef __sgi - /* machine-dependent definitions: */ -#define HIOFFSET 0 /* word offset to find MSB; endianness-dependent */ -#define LOWOFFSET 0 /* word offset to find MSB; endianness-dependent */ -#define int32 unsigned long /* a data type that has 32 bits */ -#define DONE_MACHINE_TYPE -#endif /* __sgi */ - -#ifdef NT - /* little-endian; most significant byte is at highest address */ -#define HIOFFSET 1 -#define LOWOFFSET 0 -#define int32 unsigned long -#define DONE_MACHINE_TYPE -#endif /* NT */ - -#ifdef MACOSX -#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 */ -#define DONE_MACHINE_TYPE -#endif /* MACOSX */ - -#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 -#define DONE_MACHINE_TYPE -#endif /* __FreeBSD__ */ - -#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 u_int32_t - -#define DONE_MACHINE_TYPE -#endif /* __linux__ */ - -#ifndef DONE_MACHINE_TYPE -#error -- no machine architecture definition? -#endif - -#define A1 ((float)(4 * (3.14159265/2))) -#define A3 ((float)(64 * (2.5 - 3.14159265))) -#define A5 ((float)(1024 * ((3.14159265/2) - 1.5))) - -static void pafctl_run(t_pafctl *x, float *out1, int n) -{ - float freqval, freqinc; - float cfval, cfinc; - float bwval, bwinc; - float ampval, ampinc; - float vibval, vibinc; - float vfrval, vfrinc; - float shiftval, shiftinc; - float bwquotient, bwqincr; - double ub32 = UNITBIT32; - double phase = x->x_phase + ub32; - double phasehack; - volatile double *phasehackp = &phasehack; - double shiftphase = x->x_shiftphase + ub32; - volatile int32 *hackptr = ((int32 *)(phasehackp)) + HIOFFSET, hackval; - volatile int32 *lowptr = ((int32 *)(phasehackp)) + LOWOFFSET, lowbits; - float held_freq = x->x_held_freq; - float held_intcar = x->x_held_intcar; - float held_fraccar = x->x_held_fraccar; - float held_bwquotient = x->x_held_bwquotient; - float sinvib, vibphase; - t_tabpoint *paf_table = (x->x_cauchy ? paf_cauchy : paf_gauss); - *phasehackp = ub32; - hackval = *hackptr; - - /* fractional part of shift phase */ - *phasehackp = shiftphase; - *hackptr = hackval; - shiftphase = *phasehackp; - - /* propagate line envelopes */ - LINENV_RUN(x->x_freqenv, freqval, freqinc); - LINENV_RUN(x->x_cfenv, cfval, cfinc); - LINENV_RUN(x->x_bwenv, bwval, bwinc); - LINENV_RUN(x->x_ampenv, ampval, ampinc); - LINENV_RUN(x->x_vibenv, vibval, vibinc); - LINENV_RUN(x->x_vfrenv, vfrval, vfrinc); - LINENV_RUN(x->x_shiftenv, shiftval, shiftinc); - - /* fake line envelope for quotient of bw and frequency */ - bwquotient = bwval/freqval; - bwqincr = (((float)(x->x_bwenv.l_current))/ - ((float)(x->x_freqenv.l_current)) - bwquotient) * - x->x_freqenv.l_1overn; - - /* run the vibrato oscillator */ - - *phasehackp = ub32 + (x->x_vibphase + n * x->x_isr * vfrval); - *hackptr = hackval; - vibphase = (x->x_vibphase = *phasehackp - ub32); - if (vibphase > 0.5) - sinvib = 1.0f - 16.0f * (0.75f-vibphase) * (0.75f - vibphase); - else sinvib = -1.0f + 16.0f * (0.25f-vibphase) * (0.25f - vibphase); - freqval = freqval * (1.0f + vibval * sinvib); - - shiftval *= x->x_isr; - shiftinc *= x->x_isr; - - /* if phase or amplitude is zero, load in new params */ - if (ampval == 0 || phase == ub32 || x->x_triggerme) - { - float cf_over_freq = cfval/freqval; - held_freq = freqval * x->x_isr; - held_intcar = (float)((int)cf_over_freq); - held_fraccar = cf_over_freq - held_intcar; - held_bwquotient = bwquotient; - x->x_triggerme = 0; - } - while (n--) - { - double newphase = phase + held_freq; - double carphase1, carphase2, fracnewphase; - float fphase, fcarphase1, fcarphase2, carrier; - float g, g2, g3, cosine1, cosine2, halfsine, mod, tabfrac; - t_tabpoint *p; - /* put new phase into 64-bit memory location. Bash upper - 32 bits to get fractional part (plus "ub32"). */ - - *phasehackp = newphase; - *hackptr = hackval; - newphase = *phasehackp; - fracnewphase = newphase-ub32; - fphase = 2.0f * ((float)(fracnewphase)) - 1.0f; - if (newphase < phase) - { - float cf_over_freq = cfval/freqval; - held_freq = freqval * x->x_isr; - held_intcar = (float)((int)cf_over_freq); - held_fraccar = cf_over_freq - held_intcar; - held_bwquotient = bwquotient; - } - phase = newphase; - *phasehackp = fracnewphase * held_intcar + shiftphase; - *hackptr = hackval; - carphase1 = *phasehackp; - fcarphase1 = carphase1 - ub32; - *phasehackp = carphase1 + fracnewphase; - *hackptr = hackval; - carphase2 = *phasehackp; - fcarphase2 = carphase2 - ub32; - - shiftphase += shiftval; - - if (fcarphase1 > 0.5f) g = fcarphase1 - 0.75f; - else g = 0.25f - fcarphase1; - g2 = g * g; - g3 = g * g2; - cosine1 = g * A1 + g3 * A3 + g2 * g3 * A5; - - if (fcarphase2 > 0.5f) g = fcarphase2 - 0.75f; - else g = 0.25f - fcarphase2; - g2 = g * g; - g3 = g * g2; - cosine2 = g * A1 + g3 * A3 + g2 * g3 * A5; - - carrier = cosine1 + held_fraccar * (cosine2-cosine1); - - ampval += ampinc; - bwquotient += bwqincr; - - /* printf("bwquotient %f\n", bwquotient); */ - - halfsine = held_bwquotient * (1.0f - fphase * fphase); - if (halfsine >= (float)(0.997 * TABRANGE)) - halfsine = (float)(0.997 * TABRANGE); - -#if 0 - shape = halfsine * halfsine; - mod = ampval * carrier * - (1 - bluntval * shape) / (1 + (1 - bluntval) * shape); -#endif -#if 0 - shape = halfsine * halfsine; - mod = ampval * carrier * - exp(-shape); -#endif - halfsine *= (float)(1./TABRANGE); - - /* Get table index for "halfsine". Bash upper - 32 bits to get fractional part (plus "ub32"). Also grab - fractional part as a fixed-point number to use as table - address later. */ - - *phasehackp = halfsine + ub32; - lowbits = *lowptr; - - /* now shift again so that the fractional table address - appears in the low 32 bits, bash again, and extract this as - a floating point number from 0 to 1. */ - *phasehackp = halfsine + TABFRACSHIFT; - *hackptr = hackval; - tabfrac = *phasehackp - ub32; - - p = paf_table + (lowbits >> (32 - LOGTABSIZE)); - mod = ampval * carrier * (p->p_y + tabfrac * p->p_diff); - - *out1++ = mod; - } - x->x_phase = phase - ub32; - x->x_shiftphase = shiftphase - ub32; - x->x_held_freq = held_freq; - x->x_held_intcar = held_intcar; - x->x_held_fraccar = held_fraccar; - x->x_held_bwquotient = held_bwquotient; -} - -static void pafctl_init(t_pafctl *x) -{ - linenv_init(&x->x_freqenv); - linenv_init(&x->x_cfenv); - linenv_init(&x->x_bwenv); - linenv_init(&x->x_ampenv); - linenv_init(&x->x_vibenv); - linenv_init(&x->x_vfrenv); - linenv_init(&x->x_shiftenv); - x->x_freqenv.l_target = x->x_freqenv.l_current = 1.0; - x->x_isr = (float)(1./44100.); - x->x_held_freq = 1.f; - x->x_held_intcar = 0.f; - x->x_held_fraccar = 0.f; - x->x_held_bwquotient = 0.f; - x->x_phase = 0.; - x->x_shiftphase = 0.; - x->x_vibphase = 0.; - x->x_triggerme = 0; - x->x_cauchy = 0; -} - -static void pafctl_setsr(t_pafctl *x, float sr, int vecsize) -{ - x->x_isr = 1.f/sr; - linenv_setsr(&x->x_freqenv, sr, vecsize); - linenv_setsr(&x->x_cfenv, sr, vecsize); - linenv_setsr(&x->x_bwenv, sr, vecsize); - linenv_setsr(&x->x_ampenv, sr, vecsize); - linenv_setsr(&x->x_vibenv, sr, vecsize); - linenv_setsr(&x->x_vfrenv, sr, vecsize); - linenv_setsr(&x->x_shiftenv, sr, vecsize); -} - -static void pafctl_freq(t_pafctl *x, float val, int time) -{ - if (val < 1.f) val = 1.f; - if (val > 10000000.f) val = 1000000.f; - linenv_set(&x->x_freqenv, val, time); -} - -static void pafctl_cf(t_pafctl *x, float val, int time) -{ - linenv_set(&x->x_cfenv, val, time); -} - -static void pafctl_bw(t_pafctl *x, float val, int time) -{ - linenv_set(&x->x_bwenv, val, time); -} - -static void pafctl_amp(t_pafctl *x, float val, int time) -{ - linenv_set(&x->x_ampenv, val, time); -} - -static void pafctl_vib(t_pafctl *x, float val, int time) -{ - linenv_set(&x->x_vibenv, val, time); -} - -static void pafctl_vfr(t_pafctl *x, float val, int time) -{ - linenv_set(&x->x_vfrenv, val, time); -} - -static void pafctl_shift(t_pafctl *x, float val, int time) -{ - linenv_set(&x->x_shiftenv, val, time); -} - -static void pafctl_phase(t_pafctl *x, float mainphase, float shiftphase, - float vibphase) -{ - x->x_phase = mainphase; - x->x_shiftphase = shiftphase; - x->x_vibphase = vibphase; - x->x_triggerme = 1; -} - - /* value of Cauchy distribution at TABRANGE */ -#define CAUCHYVAL (1./ (1. + TABRANGE * TABRANGE)) - /* first derivative of Cauchy distribution at TABRANGE */ -#define CAUCHYSLOPE ((-2. * TABRANGE) * CAUCHYVAL * CAUCHYVAL) -#define ADDSQ (- CAUCHYSLOPE / (2 * TABRANGE)) - -static void paf_dosetup(void) -{ - int i; - float CAUCHYFAKEAT3 = - (CAUCHYVAL + ADDSQ * TABRANGE * TABRANGE); - float CAUCHYRESIZE = (1./ (1. - CAUCHYFAKEAT3)); - for (i = 0; i <= TABSIZE; i++) - { - float f = i * ((float)TABRANGE/(float)TABSIZE); - float gauss = exp(-f * f); - float cauchygenuine = 1. / (1. + f * f); - float cauchyfake = cauchygenuine + ADDSQ * f * f; - float cauchyrenorm = (cauchyfake - 1.) * CAUCHYRESIZE + 1.; - if (i != TABSIZE) - { - paf_gauss[i].p_y = gauss; - paf_cauchy[i].p_y = cauchyrenorm; - /* post("%f", cauchyrenorm); */ - } - if (i != 0) - { - paf_gauss[i-1].p_diff = gauss - paf_gauss[i-1].p_y; - paf_cauchy[i-1].p_diff = cauchyrenorm - paf_cauchy[i-1].p_y; - } - } -} - -#ifdef TESTME - -#define BS 64 -main() -{ - t_pafctl x; - float x1[BS]; - int i; - paf_dosetup(); - pafctl_init(&x); - pafctl_setsr(&x, 16000., BS); - pafctl_freq(&x, 1000, 0); - pafctl_bw(&x, 2000, 0); - pafctl_amp(&x, 1000, 0); - pafctl_run(&x, x1, BS); - for (i = 0; i < BS/4; i++) - { - printf("%15.5f %15.5f %15.5f %15.5f\n", - x1[4*i], x1[4*i+1], x1[4*i+2], x1[4*i+3]); - } -#if 0 - printf("\n"); - pafctl_bw(&x, 2000, 0); - pafctl_run(&x, x1, BS); - for (i = 0; i < BS/4; i++) - { - printf("%15.5f %15.5f %15.5f %15.5f\n", - x1[4*i], x1[4*i+1], x1[4*i+2], x1[4*i+3]); - } -#endif -} - -#endif -#ifdef FTS1X - -static fts_symbol_t *paf_dspname; - -typedef struct _paf -{ - fts_object_t ob; /* object header */ - t_pafctl pafctl; -} paf_t; - -/* ---------------------------------------- */ -/* Methods */ -/* ---------------------------------------- */ - - /* formalities... */ - -static void paf_dspfun(fts_word_t *a) -{ - paf_t *x = (paf_t *)fts_word_get_obj(a); - float *out1 = (float *)fts_word_get_obj(a + 1); - long n = fts_word_get_long(a + 3); - - pafctl_run(&x->pafctl, out1, n); -} - -void paf_put(fts_object_t *o, int winlet, fts_symbol_t *s, - int ac, const fts_atom_t *at) -{ - paf_t *x = (paf_t *)o; - fts_dsp_descr_t *dsp = (fts_dsp_descr_t *)fts_get_obj_arg(at, ac, 0, 0); - fts_atom_t a[4]; - float sr = fts_dsp_get_output_srate(dsp, 0); - int vecsize = fts_dsp_get_output_size(dsp, 0); - - pafctl_setsr(&x->pafctl, sr, vecsize); - fts_set_obj(a, x); - fts_set_symbol(a+1, fts_dsp_get_output_name(dsp, 0)); - fts_set_long(a+2, fts_dsp_get_output_size(dsp, 0)); - dsp_add_funcall(paf_dspname, 3, a); -} - -static void paf_freq(fts_object_t *o, int winlet, fts_symbol_t *s, - int ac, const fts_atom_t *at) -{ - paf_t *this = (paf_t *)o; - float val = fts_get_float_long_arg( at, ac, 0, 0.0f); - int time = fts_get_long_arg(at, ac, 1, 0); - pafctl_freq(&this->pafctl, val, time); -} - -static void paf_cf(fts_object_t *o, int winlet, fts_symbol_t *s, - int ac, const fts_atom_t *at) -{ - paf_t *this = (paf_t *)o; - float val = fts_get_float_long_arg( at, ac, 0, 0.0f); - int time = fts_get_long_arg(at, ac, 1, 0); - pafctl_cf(&this->pafctl, val, time); -} - -static void paf_bw(fts_object_t *o, int winlet, fts_symbol_t *s, - int ac, const fts_atom_t *at) -{ - paf_t *this = (paf_t *)o; - float val = fts_get_float_long_arg( at, ac, 0, 0.0f); - int time = fts_get_long_arg(at, ac, 1, 0); - pafctl_bw(&this->pafctl, val, time); -} - -static void paf_amp(fts_object_t *o, int winlet, fts_symbol_t *s, - int ac, const fts_atom_t *at) -{ - paf_t *this = (paf_t *)o; - - float val = fts_get_float_long_arg( at, ac, 0, 0.0f); - int time = fts_get_long_arg(at, ac, 1, 0); - pafctl_amp(&this->pafctl, val, time); -} - -static void paf_vib(fts_object_t *o, int winlet, fts_symbol_t *s, - int ac, const fts_atom_t *at) -{ - paf_t *this = (paf_t *)o; - float val = fts_get_float_long_arg( at, ac, 0, 0.0f); - int time = fts_get_long_arg(at, ac, 1, 0); - pafctl_vib(&this->pafctl, val, time); -} - -static void paf_vfr(fts_object_t *o, int winlet, fts_symbol_t *s, - int ac, const fts_atom_t *at) -{ - paf_t *this = (paf_t *)o; - float val = fts_get_float_long_arg( at, ac, 0, 0.0f); - int time = fts_get_long_arg(at, ac, 1, 0); - pafctl_vfr(&this->pafctl, val, time); -} - -static void paf_shift(fts_object_t *o, int winlet, fts_symbol_t *s, - int ac, const fts_atom_t *at) -{ - paf_t *this = (paf_t *)o; - float val = fts_get_float_long_arg( at, ac, 0, 0.0f); - int time = fts_get_long_arg(at, ac, 1, 0); - pafctl_shift(&this->pafctl, val, time); -} - -static void paf_phase(fts_object_t *o, int winlet, fts_symbol_t *s, - int ac, const fts_atom_t *at) -{ - paf_t *this = (paf_t *)o; - float phase = fts_get_float_long_arg( at, ac, 0, 0.0f); - float shiftphase = fts_get_long_arg(at, ac, 1, 0); - float vibphase = fts_get_long_arg(at, ac, 2, 0); - pafctl_shift(&this->pafctl, phase, shiftphase, vibphase); -} - -static void -paf_print(fts_object_t *o, int winlet, fts_symbol_t *s, int ac, const fts_atom_t *at) -{ -} - -static void -paf_init(fts_object_t *o, int winlet, fts_symbol_t *s, int ac, const fts_atom_t *at) -{ - paf_t *this = (paf_t *)o; - int i; - - dsp_list_insert(o); /* put object in list */ - pafctl_init(&this->pafctl); -} - -static void paf_delete(fts_object_t *o, int winlet, fts_symbol_t *s, - int ac, const fts_atom_t *at) -{ - paf_t *this = (paf_t *)o; - - dsp_list_remove(o); -} - -static fts_status_t paf_instantiate( fts_class_t *cl, - int ac, const fts_atom_t *at) -{ - fts_atom_type_t a[3]; - - fts_class_init( cl, sizeof(paf_t), 1, 2, 0); - - a[0] = fts_Symbol; - fts_method_define( cl, fts_SystemInlet, fts_s_init, paf_init, 1, a); - fts_method_define( cl, fts_SystemInlet, fts_s_delete, paf_delete, 1, a); - - a[0] = fts_Float|fts_Long; - a[1] = fts_Long; - fts_method_define( cl, 0, fts_new_symbol("freq"), paf_freq, 2, a); - fts_method_define( cl, 0, fts_new_symbol("cf"), paf_cf, 2, a); - fts_method_define( cl, 0, fts_new_symbol("bw"), paf_bw, 2, a); - fts_method_define( cl, 0, fts_new_symbol("amp"), paf_amp, 2, a); - fts_method_define( cl, 0, fts_new_symbol("vib"), paf_vib, 2, a); - fts_method_define( cl, 0, fts_new_symbol("vfr"), paf_vfr, 2, a); - fts_method_define( cl, 0, fts_new_symbol("shift"), paf_shift, 2, a); - fts_method_define( cl, 0, fts_new_symbol("phase"), paf_phase, 3, a); - - fts_method_define( cl, 0, fts_new_symbol("print"), paf_print, 0, 0); - - a[0] = fts_Object; - fts_method_define(cl, fts_SystemInlet, fts_new_symbol("put"), - paf_put, 1, a); - - dsp_sig_inlet(cl, 0); /* order forcing only */ - - dsp_sig_outlet(cl, 0); - - return fts_Success; -} - -fts_symbol_t *paf_qui; - -void paf_config(void) -{ - sys_log(paf_version); - paf_dspname = fts_new_symbol("paf"); - dsp_declare_function(paf_dspname, paf_dspfun); - fts_metaclass_create(fts_new_symbol("paf"), - paf_instantiate, fts_always_equiv); - paf_dosetup(); -} - -fts_module_t paf_module = - {"paf", "paf", paf_config, 0}; - -#endif /* FTS1X */ - -#ifdef V26 - -typedef struct _paf -{ - t_head x_h; - t_sig *x_io[IN1+OUT1]; - t_pafctl x_pafctl; -} t_paf; - -static void paf_put(t_paf *x, long int whether) -{ - if (whether) - { - float sr = x->x_io[0]->s_sr; - int vecsize = x->x_io[0]->s_n; - u_stdout((t_ugen *)x); - pafctl_setsr(&x->x_pafctl, sr, vecsize); - dspchain_addc(pafctl_run, 3, - &x->x_pafctl, x->x_io[1]->s_shit, x->x_io[1]->s_n); - } -} - -static void paf_freq(t_paf *x, double val, int time) -{ - pafctl_freq(&x->x_pafctl, val, time); -} - -static void paf_cf(t_paf *x, double val, int time) -{ - pafctl_cf(&x->x_pafctl, val, time); -} - -static void paf_bw(t_paf *x, double val, int time) -{ - pafctl_bw(&x->x_pafctl, val, time); -} - -static void paf_amp(t_paf *x, double val, int time) -{ - pafctl_amp(&x->x_pafctl, val, time); -} - -static void paf_vib(t_paf *x, double val, int time) -{ - pafctl_vib(&x->x_pafctl, val, time); -} - -static void paf_vfr(t_paf *x, double val, int time) -{ - pafctl_vfr(&x->x_pafctl, val, time); -} - -static void paf_shift(t_paf *x, double val, int time) -{ - pafctl_shift(&x->x_pafctl, val, time); -} - -static void paf_phase(t_paf *x, double phase, double shiftphase, - double vibphase) -{ - pafctl_phase(&x->x_pafctl, phase, shiftphase, vibphase); -} - -static void paf_debug(t_paf *x) -{ - linenv_debug( &x->x_pafctl.x_ampenv, "amp"); - linenv_debug(&x->x_pafctl.x_freqenv, "fre"); -} - -t_externclass *paf_class; - -static void *paf_new() -{ - t_paf *x = (t_paf *)obj_new(&paf_class, 0); - u_setup((t_ugen *)x, IN1, OUT1); - u_setforcer(x); - pafctl_init(&x->x_pafctl); - return (x); -} - -void sigpaf_setup() -{ - post(paf_version); - c_extern(&paf_class, paf_new, u_clean, - gensym("paf"), sizeof(t_paf), 0, 0); - c_addmess(paf_put, gensym("put"), A_CANT, 0); - c_addmess(paf_freq, gensym("freq"), A_FLOAT, A_LONG, 0); - c_addmess(paf_cf, gensym("cf"), A_FLOAT, A_LONG, 0); - c_addmess(paf_bw, gensym("bw"), A_FLOAT, A_LONG, 0); - c_addmess(paf_amp, gensym("amp"), A_FLOAT, A_LONG, 0); - c_addmess(paf_vib, gensym("vib"), A_FLOAT, A_LONG, 0); - c_addmess(paf_vfr, gensym("vfr"), A_FLOAT, A_LONG, 0); - c_addmess(paf_shift, gensym("shift"), A_FLOAT, A_LONG, 0); - c_addmess(paf_phase, gensym("phase"), A_FLOAT, A_FLOAT, A_FLOAT, 0); - c_addmess(paf_debug, gensym("debug"), 0); - u_inletmethod(0); - paf_dosetup(); -} - -#endif /* V26 */ - -#ifdef PD - -typedef struct _paf -{ - t_object x_obj; - t_pafctl x_pafctl; -} t_paf; - -static t_class *paf_class; - -static void *paf_new(void) -{ - t_paf *x = (t_paf *)pd_new(paf_class); - pafctl_init(&x->x_pafctl); - outlet_new(&x->x_obj, gensym("signal")); - return (x); -} - -static t_int *paf_perform(t_int *w) -{ - t_pafctl *ctl = (t_pafctl *)(w[1]); - t_float *out1 = (t_float *)(w[2]); - int n = (int)(w[3]); - pafctl_run(ctl, out1, n); - return (w+4); -} - -static void paf_dsp(t_paf *x, t_signal **sp) -{ - float sr = sp[0]->s_sr; - int vecsize = sp[0]->s_n; - pafctl_setsr(&x->x_pafctl, sr, vecsize); - dsp_add(paf_perform, 3, - &x->x_pafctl, sp[0]->s_vec, sp[0]->s_n); -} - -static void paf_freq(t_paf *x, t_floatarg val, t_floatarg time) -{ - pafctl_freq(&x->x_pafctl, val, time); -} - -static void paf_cf(t_paf *x, t_floatarg val, t_floatarg time) -{ - pafctl_cf(&x->x_pafctl, val, time); -} - -static void paf_bw(t_paf *x, t_floatarg val, t_floatarg time) -{ - pafctl_bw(&x->x_pafctl, val, time); -} - -static void paf_amp(t_paf *x, t_floatarg val, t_floatarg time) -{ - pafctl_amp(&x->x_pafctl, val, time); -} - -static void paf_vib(t_paf *x, t_floatarg val, t_floatarg time) -{ - pafctl_vib(&x->x_pafctl, val, time); -} - -static void paf_vfr(t_paf *x, t_floatarg val, t_floatarg time) -{ - pafctl_vfr(&x->x_pafctl, val, time); -} - -static void paf_shift(t_paf *x, t_floatarg val, t_floatarg time) -{ - pafctl_shift(&x->x_pafctl, val, time); -} - -static void paf_phase(t_paf *x, t_floatarg mainphase, t_floatarg shiftphase, - t_floatarg vibphase) -{ - pafctl_phase(&x->x_pafctl, mainphase, shiftphase, vibphase); -} - -static void paf_setcauchy(t_paf *x, t_floatarg f) -{ - x->x_pafctl.x_cauchy = (f != 0); -} - -static void paf_debug(t_paf *x) -{ - /* whatever you want... */ -} - -void paf_tilde_setup(void) -{ - post(paf_version); - paf_class = class_new(gensym("paf~"), (t_newmethod)paf_new, 0, - sizeof(t_paf), 0, 0); - class_addmethod(paf_class, (t_method)paf_dsp, gensym("dsp"), A_CANT, 0); - class_addmethod(paf_class, (t_method)paf_freq, gensym("freq"), - A_FLOAT, A_DEFFLOAT, 0); - class_addmethod(paf_class, (t_method)paf_cf, gensym("cf"), - A_FLOAT, A_DEFFLOAT, 0); - class_addmethod(paf_class, (t_method)paf_bw, gensym("bw"), - A_FLOAT, A_DEFFLOAT, 0); - class_addmethod(paf_class, (t_method)paf_amp, gensym("amp"), - A_FLOAT, A_DEFFLOAT, 0); - class_addmethod(paf_class, (t_method)paf_vib, gensym("vib"), - A_FLOAT, A_DEFFLOAT, 0); - class_addmethod(paf_class, (t_method)paf_vfr, gensym("vfr"), - A_FLOAT, A_DEFFLOAT, 0); - class_addmethod(paf_class, (t_method)paf_shift, gensym("shift"), - A_FLOAT, A_DEFFLOAT, 0); - class_addmethod(paf_class, (t_method)paf_phase, gensym("phase"), - A_FLOAT, A_FLOAT, A_FLOAT, 0); - class_addmethod(paf_class, (t_method)paf_setcauchy, gensym("cauchy"), - A_FLOAT, 0); - class_addmethod(paf_class, (t_method)paf_debug, gensym("debug"), 0); - paf_dosetup(); -} - -#endif /* PD */ |