[PD-cvs] externals/ggee/experimental fofsynth~.c, 1.1.1.1, 1.2 pvocfreq.c, 1.1.1.1, 1.2

Hans-Christoph Steiner eighthave at users.sourceforge.net
Mon Nov 14 22:59:10 CET 2005


Update of /cvsroot/pure-data/externals/ggee/experimental
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8684/experimental

Modified Files:
	fofsynth~.c pvocfreq.c 
Log Message:
these pragmas are only used for MSVC, not MinGW or Cygwin, therefore changing the define from NT to _MSC_VER

Index: pvocfreq.c
===================================================================
RCS file: /cvsroot/pure-data/externals/ggee/experimental/pvocfreq.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** pvocfreq.c	17 Jun 2002 10:13:54 -0000	1.1.1.1
--- pvocfreq.c	14 Nov 2005 21:59:08 -0000	1.2
***************
*** 1,114 ****
! /* (C) Guenter Geiger <geiger at epy.co.at> */
! 
! 
! #include <m_pd.h>
! #ifdef NT
! #pragma warning( disable : 4244 )
! #pragma warning( disable : 4305 )
! #endif
! 
! /* ------------------------ shuffle ----------------------------- */
! 
! static t_class *shuffle_class;
! 
! 
! typedef struct _shuffle
! {
!      t_object x_obj;
!      t_float x;
! } t_shuffle;
! 
! 
! void shuffle_float(t_shuffle *x, t_floatarg f)
! {
!      post("float %f",f);
!      x->x = f;
! }
! 
! 
! 
! static t_int *shuffle_perform(t_int *w)
! {
!      t_shuffle* x = (t_shuffle*)(w[1]);
!      t_float* in1 = (t_float*) w[2];
!      t_float* in2 = (t_float*) w[3];
!      t_float* out = (t_float*) w[4];
!      int n = w[5];
! 
!      if (x->x <= 0) {
! 	  while (n--) {
! 	       *out++ = *in1++;
! 	  }    
! 	  return w+6;
!      }
! 
!      if (x->x < 0.5) {
! 	  t_int index = 1/x->x;
! 	  while (n--) {
! 	       if (n%index){ 
! 		    *out++ = *in1++;
! 		    in2++;
! 	       }
! 	       else {
! 		    *out++ = *in2++;
! 		    in1++;
! 	       }
! 	  }
! 	  return w+6;
!      }
! 
!      if (x->x > 1.0) {
! 	  while (n--) {
! 	       *out++ = *in2++;
! 	  }    
! 	  return w+6;
!      }
! 
!      if (x->x >= 0.5) {
! 	  t_int index = 1/(1.0- x->x);
! 	  while (n--) {
! 	       if (n%index) { 
! 		    *out++ = *in2++;
! 		    in1++;
! 	       }
! 	       else {
! 		    *out++ = *in1++;
! 		    in2++;
! 	       }
! 	  }
!      }
! 
!      return w+6;
! }
! 
! 
! static void shuffle_dsp(t_shuffle *x, t_signal **sp)
! {
! 	  dsp_add(shuffle_perform, 5, x, sp[0]->s_vec, 
! 		  sp[1]->s_vec,sp[2]->s_vec, sp[0]->s_n);
! 
! }
! 
! static void *shuffle_new()
! {
!     t_shuffle *x = (t_shuffle *)pd_new(shuffle_class);
! 
!     inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
! 
! 
!     outlet_new(&x->x_obj, gensym("signal"));
!     return (x);
! }
! 
! void shuffle_setup(void)
! {
!     shuffle_class = class_new(gensym("shuffle~"), (t_newmethod)shuffle_new, 0,
! 				sizeof(t_shuffle), 0,0);
!     
!     class_addmethod(shuffle_class, nullfn, gensym("signal"), 0);
!     class_addmethod(shuffle_class, (t_method) shuffle_dsp, gensym("dsp"), 0);
!     
!     class_addfloat(shuffle_class,shuffle_float);
! }
! 
! 
--- 1,114 ----
! /* (C) Guenter Geiger <geiger at epy.co.at> */
! 
! 
! #include <m_pd.h>
! #ifdef _MSC_VER
! #pragma warning( disable : 4244 )
! #pragma warning( disable : 4305 )
! #endif
! 
! /* ------------------------ shuffle ----------------------------- */
! 
! static t_class *shuffle_class;
! 
! 
! typedef struct _shuffle
! {
!      t_object x_obj;
!      t_float x;
! } t_shuffle;
! 
! 
! void shuffle_float(t_shuffle *x, t_floatarg f)
! {
!      post("float %f",f);
!      x->x = f;
! }
! 
! 
! 
! static t_int *shuffle_perform(t_int *w)
! {
!      t_shuffle* x = (t_shuffle*)(w[1]);
!      t_float* in1 = (t_float*) w[2];
!      t_float* in2 = (t_float*) w[3];
!      t_float* out = (t_float*) w[4];
!      int n = w[5];
! 
!      if (x->x <= 0) {
! 	  while (n--) {
! 	       *out++ = *in1++;
! 	  }    
! 	  return w+6;
!      }
! 
!      if (x->x < 0.5) {
! 	  t_int index = 1/x->x;
! 	  while (n--) {
! 	       if (n%index){ 
! 		    *out++ = *in1++;
! 		    in2++;
! 	       }
! 	       else {
! 		    *out++ = *in2++;
! 		    in1++;
! 	       }
! 	  }
! 	  return w+6;
!      }
! 
!      if (x->x > 1.0) {
! 	  while (n--) {
! 	       *out++ = *in2++;
! 	  }    
! 	  return w+6;
!      }
! 
!      if (x->x >= 0.5) {
! 	  t_int index = 1/(1.0- x->x);
! 	  while (n--) {
! 	       if (n%index) { 
! 		    *out++ = *in2++;
! 		    in1++;
! 	       }
! 	       else {
! 		    *out++ = *in1++;
! 		    in2++;
! 	       }
! 	  }
!      }
! 
!      return w+6;
! }
! 
! 
! static void shuffle_dsp(t_shuffle *x, t_signal **sp)
! {
! 	  dsp_add(shuffle_perform, 5, x, sp[0]->s_vec, 
! 		  sp[1]->s_vec,sp[2]->s_vec, sp[0]->s_n);
! 
! }
! 
! static void *shuffle_new()
! {
!     t_shuffle *x = (t_shuffle *)pd_new(shuffle_class);
! 
!     inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
! 
! 
!     outlet_new(&x->x_obj, gensym("signal"));
!     return (x);
! }
! 
! void shuffle_setup(void)
! {
!     shuffle_class = class_new(gensym("shuffle~"), (t_newmethod)shuffle_new, 0,
! 				sizeof(t_shuffle), 0,0);
!     
!     class_addmethod(shuffle_class, nullfn, gensym("signal"), 0);
!     class_addmethod(shuffle_class, (t_method) shuffle_dsp, gensym("dsp"), 0);
!     
!     class_addfloat(shuffle_class,shuffle_float);
! }
! 
! 

Index: fofsynth~.c
===================================================================
RCS file: /cvsroot/pure-data/externals/ggee/experimental/fofsynth~.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** fofsynth~.c	17 Jun 2002 10:13:54 -0000	1.1.1.1
--- fofsynth~.c	14 Nov 2005 21:59:08 -0000	1.2
***************
*** 1,354 ****
! /* (C) Guenter Geiger <geiger at epy.co.at> */
! 
! 
! #include <m_pd.h>
! #include <math.h>
! #ifdef NT
! #pragma warning( disable : 4244 )
! #pragma warning( disable : 4305 )
! #endif
! 
! /* ------------------------ fofsynth~ ----------------------------- */
! 
! #ifndef NT
! void garray_usedindsp(t_garray *x);
! #endif
! 
! #define DEBUG(a,b) if (x->debug) post(a,b);
! 
! #define MAXGRAINS 1000
! #define PD_PI 3.14159
! 
! static float* cos_table;
! static float* halfcos_table;
! static float* exp_table;
! 
! static void cos_maketable(void)
! {
!      int i;
!      float *fp, phase, phsinc = (2. * PD_PI) / COSTABSIZE;
!      
!      if (cos_table) return;
!      cos_table = (float *)getbytes(sizeof(float) * (COSTABSIZE+1));
!      
!      for (i = COSTABSIZE + 1, fp = cos_table, phase = 0; i--;
! 	  fp++, phase += phsinc) 
! 	  *fp = cos(phase);
!      
! }
! 
! static void halfcos_maketable(void)
! {
!      int i;
!      float *fp, phase, phsinc = (PD_PI) / COSTABSIZE;
!      
!      if (halfcos_table) return;
!      halfcos_table = (float *)getbytes(sizeof(float) * (COSTABSIZE+1));
!      
!      for (i = COSTABSIZE + 1, fp = halfcos_table, phase = PD_PI; i--;
! 	  fp++, phase += phsinc) 
! 	  *fp = 0.5*(cos(phase) + 1.0);
! }
! 
! 
! static void exp_maketable(void)
! {
!      int i;
!      float *fp, phase, phsinc = (2 * PD_PI) / COSTABSIZE;
!      
!      if (exp_table) return;
!      exp_table = (float *)getbytes(sizeof(float) * (COSTABSIZE+1));
!      
!      for (i = COSTABSIZE + 1, fp = exp_table, phase = 0; i--;
! 	  fp++, phase += phsinc) 
! 	  *fp = exp(-phase);
! }
! 
! 
! static t_class *fofsynth_class;
! 
! typedef struct _grain 
! {
!      struct _grain *next;
!      t_float formph; /* 0 ... 1 */
!      t_float formphinc; 
!      t_float envph;
!      int falling;
! } t_grain;
! 
! 
! typedef struct _fofsynth
! {
!      t_object x_obj;
! 
!      /* it is possible to use 2 array, prob change this one
! 	int the future */
! 
!      t_symbol* x_arrayname;
! 
!      /* template */
! 
!      int x_npoints;
!      t_float *x_vec;
!      
!      /* fof */
!      int debug;
! 
!      int maxgrains;
!      int numgrains;
! 
!      float* x_envelope;
! 
!      /* the queue of grains */
! 
!      t_grain* grainbase;
!      t_grain* grainstart;
!      t_grain* grainend;
!      
! 
!      t_float fundph; /* 0 to 1; if 1 -> add a new grain */
! 
!      t_float fundfreq; /* input parameter 1 */
!      t_float formfreq; /* input paramter 2 */
!      t_float risedur; /* input parameter 3 ( in % of total duration )*/
!      t_float falldur; /* input parameter 5 ( in % of total duration */
! 
!      /* other */
!      int neednewgrain;
! } t_fofsynth;
! 
! 
! 
! 
! /* build a cyclic list */
! static t_grain* grain_makecyclic(t_grain* base,int num)
! {
!      t_grain* cur = base;
!      while (--num) {
! 	  cur->next = cur+1;
! 	  cur++;
!      }
!      cur->next = base;
! 	 return base;
! }
! 
! 
! 
! 
! 
! static t_int *fofsynth_perform(t_int *w)
! {
!      t_fofsynth* x = (t_fofsynth*) (w[1]);
!      t_float *in = (t_float *)(w[2]);
!      t_float *out = (t_float *)(w[3]);
!      int n = (int)(w[4]);
! 
!      float totaldur = (x->risedur+ x->falldur)*0.01/ *in;
! 
!      float srate = 44100.0; /*((t_signal*)w[2])->s_sr;*/
!      float israte = 1.0/srate;
! 
!      float fundphase = x->fundph;
!      float numperiods = totaldur*x->formfreq;
!      float formphinc = (x->formfreq/srate);
! 
!      float risinc;
!      float fallinc;
! 
!      t_grain* cur;
! 
!      risinc = (x->risedur == 0) ? 1.0 : 1.0/ (srate*totaldur*0.01*x->risedur);
!      fallinc = (x->falldur ==  0.0) ? 1.0 :1.0/ (srate*totaldur*0.01*x->falldur);
!      
!      DEBUG(" fundph %3.2f",x->fundph);
!      DEBUG(" fundfreq %3.2f",x->fundfreq);
!      DEBUG(" formfreq %3.2f",x->formfreq);
!      DEBUG(" risedur %3.2f %",x->risedur);
!      DEBUG(" falldur %3.2f %",x->falldur);
!      DEBUG(" totaldur %3.2f s",totaldur);
!      DEBUG(" risinc %0.6f",risinc);
!      DEBUG(" fallinc %0.6f",fallinc);
!      DEBUG(" formant increase %3.2f",formphinc);
!      DEBUG(" numgrains %d",x->numgrains);
!     
!      while (n--)
!      {
! 	  fundphase+=*++in*israte;
! 	  *out = 0.0;
! 
! 	  if (x->neednewgrain) {  /* new grain, they are deleted separetely */
! 	       t_grain* newgrain = x->grainend;
! /*	       DEBUG("new grain created",0); */
! 	       if (newgrain->next == x->grainstart) {
! 		    post("fof: grain overflow");		   
! 		    x->neednewgrain = 0;  
! 	       }
! 	       else {
! 		    x->numgrains++;
! 		    x->grainend = newgrain->next;
! 		    newgrain->formphinc = formphinc;
! 		    newgrain->falling = 0;
! 		    newgrain->formph = newgrain->envph = 0.0;
! 		    x->neednewgrain = 0;  
! 	       }
! 	  }
! 
! 	  cur = x->grainstart;
! 	  while (cur != x->grainend) {
! 	       float formphase = cur->formph;
! 	       float envelope;
! 
! 	       float tph = (formphase - (float)((int) formphase));
! 	       float val = *(x->x_vec + (int) (tph * x->x_npoints));
! 
! 	       /* Apply the envelope */
! 
! 	       if (!cur->falling && (cur->envph <= 1.0)) { 
! 		    envelope = *(halfcos_table + (int) (cur->envph * COSTABSIZE));
! 		    cur->envph+=risinc;
! 		    val *= envelope;
! 	       }
! 	       else if (!cur->falling)
! 	       {
! 		    cur->falling = 1;
! 		    cur->envph = 0;
! 	       }
! 	       
! 
! 	       if (cur->falling) {
! 		    envelope = *(exp_table + (int) (cur->envph * COSTABSIZE));
! 		    cur->envph+=fallinc;
! 		    val *= envelope;
! 	       }		    
! 
! 	       /* end of envelope code */
! 
! 
! 	       formphase+=cur->formphinc;
! 	       cur->formph = formphase;
! 	       
! 	       if (formphase >= numperiods) { /* dead */
! 		    DEBUG("grain died",0);
! 		    x->grainstart = cur->next;
! 		    x->numgrains--;/* not needed */
! 	       }
! 	       
! 	       cur = cur->next;
! 	       *out += val;
! 	  }
! 	  
! 
! 	  if (fundphase > 1.0) {
! 	       fundphase -=  1.0;
! 	       x->neednewgrain=1;
! 	  }
! 	  out++;
!      }
! 
!      x->fundph=fundphase;
!      x->debug = 0;
! 
! 
!      return (w+5);
! }
! 
! void fofsynth_usearray(t_symbol* s,int* points,t_float** vec)
! {
!      t_garray *a;
!      if (!(a = (t_garray *)pd_findbyclass(s, garray_class))) 
! 	  error("%s: no such array", s->s_name);
!      else if (!garray_getfloatarray(a,points,vec))
! 	  error("%s: bad template for fof~", s->s_name);
!      else
! 	  garray_usedindsp(a); 
! }
! 
! static void fofsynth_dsp(t_fofsynth *x, t_signal **sp)
! {
!      
!      if (x->x_arrayname)
! 	  fofsynth_usearray(x->x_arrayname,&x->x_npoints, &x->x_vec);	
!      else {
! 	  x->x_npoints=COSTABSIZE;
! 	  x->x_vec = cos_table;
!      }
!                
!      dsp_add(fofsynth_perform, 4, x,
! 	     sp[0]->s_vec,sp[1]->s_vec, sp[0]->s_n);
! }
! 
! 
! static void fofsynth_free(t_fofsynth *x)
! {
!      freebytes(x->grainbase,sizeof(t_grain)*x->maxgrains);
! }
! 
! 
! static void fofsynth_debug(t_fofsynth* x)
! {
!      x->debug = 1;
! }
! 
! 
! static void fofsynth_float(t_fofsynth* x,t_float f)
! {
! 	x->fundfreq = f > 0.0 ? f : -f;
! }
! 
! 
! static void *fofsynth_new(t_symbol* s,t_float a,t_float b,t_float c,t_float d)
! {
!      int maxgrains = MAXGRAINS;
!      t_fofsynth *x = (t_fofsynth *)pd_new(fofsynth_class);
! 
!      x->debug = 0;
!      x->x_arrayname = s;
! 
!      if (s == &s_)
! 	  x->x_arrayname = NULL;
! 
!      /* setup the grain queue */
!      
!      x->grainbase = getbytes(sizeof(t_grain)*maxgrains);
!      x->maxgrains = maxgrains;
!      grain_makecyclic(x->grainbase,maxgrains);
!      x->grainstart = x->grainbase;
!      x->grainend = x->grainbase;    
!      x->numgrains = 0;
! 
!      /* some of them could be signals too */
! 
!      floatinlet_new(&x->x_obj, &x->formfreq);
!      floatinlet_new(&x->x_obj, &x->risedur);
!      floatinlet_new(&x->x_obj, &x->falldur);
! 
!      x->fundph = 0.0; 
!      x->fundfreq = 200.0;
!      x->formfreq = 600.0; 
!      x->risedur = 5.0; 
!      x->falldur = 140.0; 
! 
!      if (a) x->fundfreq = a;
!      if (b) x->formfreq = b; 
!      if (c) x->risedur = c; 
!      if (d) x->falldur = d; 
! 
!      outlet_new(&x->x_obj, &s_signal);
!      return (x);
! }
! 
! void fofsynth_tilde_setup(void)
! {
!      cos_table = NULL;
!      halfcos_table = NULL;
!      fofsynth_class = class_new(gensym("fof~"), (t_newmethod) fofsynth_new,(t_method) fofsynth_free,
! 				sizeof(t_fofsynth), 0,A_DEFSYM, A_DEFFLOAT,A_DEFFLOAT,A_DEFFLOAT,A_DEFFLOAT,0);
!      class_addcreator((t_newmethod)fofsynth_new,gensym("fofsynth~"),A_DEFSYM, A_DEFFLOAT,A_DEFFLOAT,A_DEFFLOAT,A_DEFFLOAT,0);
!      class_addmethod(fofsynth_class, nullfn, gensym("signal"), 0);
!      class_addmethod(fofsynth_class, (t_method) fofsynth_dsp, gensym("dsp"), 0);
!      class_addfloat(fofsynth_class, (t_method) fofsynth_float);
!      class_addmethod(fofsynth_class,(t_method) fofsynth_debug, gensym("debug"),0);
!      cos_maketable();
!      halfcos_maketable();
!      exp_maketable();
! }
--- 1,354 ----
! /* (C) Guenter Geiger <geiger at epy.co.at> */
! 
! 
! #include <m_pd.h>
! #include <math.h>
! #ifdef _MSC_VER
! #pragma warning( disable : 4244 )
! #pragma warning( disable : 4305 )
! #endif
! 
! /* ------------------------ fofsynth~ ----------------------------- */
! 
! #ifndef NT
! void garray_usedindsp(t_garray *x);
! #endif
! 
! #define DEBUG(a,b) if (x->debug) post(a,b);
! 
! #define MAXGRAINS 1000
! #define PD_PI 3.14159
! 
! static float* cos_table;
! static float* halfcos_table;
! static float* exp_table;
! 
! static void cos_maketable(void)
! {
!      int i;
!      float *fp, phase, phsinc = (2. * PD_PI) / COSTABSIZE;
!      
!      if (cos_table) return;
!      cos_table = (float *)getbytes(sizeof(float) * (COSTABSIZE+1));
!      
!      for (i = COSTABSIZE + 1, fp = cos_table, phase = 0; i--;
! 	  fp++, phase += phsinc) 
! 	  *fp = cos(phase);
!      
! }
! 
! static void halfcos_maketable(void)
! {
!      int i;
!      float *fp, phase, phsinc = (PD_PI) / COSTABSIZE;
!      
!      if (halfcos_table) return;
!      halfcos_table = (float *)getbytes(sizeof(float) * (COSTABSIZE+1));
!      
!      for (i = COSTABSIZE + 1, fp = halfcos_table, phase = PD_PI; i--;
! 	  fp++, phase += phsinc) 
! 	  *fp = 0.5*(cos(phase) + 1.0);
! }
! 
! 
! static void exp_maketable(void)
! {
!      int i;
!      float *fp, phase, phsinc = (2 * PD_PI) / COSTABSIZE;
!      
!      if (exp_table) return;
!      exp_table = (float *)getbytes(sizeof(float) * (COSTABSIZE+1));
!      
!      for (i = COSTABSIZE + 1, fp = exp_table, phase = 0; i--;
! 	  fp++, phase += phsinc) 
! 	  *fp = exp(-phase);
! }
! 
! 
! static t_class *fofsynth_class;
! 
! typedef struct _grain 
! {
!      struct _grain *next;
!      t_float formph; /* 0 ... 1 */
!      t_float formphinc; 
!      t_float envph;
!      int falling;
! } t_grain;
! 
! 
! typedef struct _fofsynth
! {
!      t_object x_obj;
! 
!      /* it is possible to use 2 array, prob change this one
! 	int the future */
! 
!      t_symbol* x_arrayname;
! 
!      /* template */
! 
!      int x_npoints;
!      t_float *x_vec;
!      
!      /* fof */
!      int debug;
! 
!      int maxgrains;
!      int numgrains;
! 
!      float* x_envelope;
! 
!      /* the queue of grains */
! 
!      t_grain* grainbase;
!      t_grain* grainstart;
!      t_grain* grainend;
!      
! 
!      t_float fundph; /* 0 to 1; if 1 -> add a new grain */
! 
!      t_float fundfreq; /* input parameter 1 */
!      t_float formfreq; /* input paramter 2 */
!      t_float risedur; /* input parameter 3 ( in % of total duration )*/
!      t_float falldur; /* input parameter 5 ( in % of total duration */
! 
!      /* other */
!      int neednewgrain;
! } t_fofsynth;
! 
! 
! 
! 
! /* build a cyclic list */
! static t_grain* grain_makecyclic(t_grain* base,int num)
! {
!      t_grain* cur = base;
!      while (--num) {
! 	  cur->next = cur+1;
! 	  cur++;
!      }
!      cur->next = base;
! 	 return base;
! }
! 
! 
! 
! 
! 
! static t_int *fofsynth_perform(t_int *w)
! {
!      t_fofsynth* x = (t_fofsynth*) (w[1]);
!      t_float *in = (t_float *)(w[2]);
!      t_float *out = (t_float *)(w[3]);
!      int n = (int)(w[4]);
! 
!      float totaldur = (x->risedur+ x->falldur)*0.01/ *in;
! 
!      float srate = 44100.0; /*((t_signal*)w[2])->s_sr;*/
!      float israte = 1.0/srate;
! 
!      float fundphase = x->fundph;
!      float numperiods = totaldur*x->formfreq;
!      float formphinc = (x->formfreq/srate);
! 
!      float risinc;
!      float fallinc;
! 
!      t_grain* cur;
! 
!      risinc = (x->risedur == 0) ? 1.0 : 1.0/ (srate*totaldur*0.01*x->risedur);
!      fallinc = (x->falldur ==  0.0) ? 1.0 :1.0/ (srate*totaldur*0.01*x->falldur);
!      
!      DEBUG(" fundph %3.2f",x->fundph);
!      DEBUG(" fundfreq %3.2f",x->fundfreq);
!      DEBUG(" formfreq %3.2f",x->formfreq);
!      DEBUG(" risedur %3.2f %",x->risedur);
!      DEBUG(" falldur %3.2f %",x->falldur);
!      DEBUG(" totaldur %3.2f s",totaldur);
!      DEBUG(" risinc %0.6f",risinc);
!      DEBUG(" fallinc %0.6f",fallinc);
!      DEBUG(" formant increase %3.2f",formphinc);
!      DEBUG(" numgrains %d",x->numgrains);
!     
!      while (n--)
!      {
! 	  fundphase+=*++in*israte;
! 	  *out = 0.0;
! 
! 	  if (x->neednewgrain) {  /* new grain, they are deleted separetely */
! 	       t_grain* newgrain = x->grainend;
! /*	       DEBUG("new grain created",0); */
! 	       if (newgrain->next == x->grainstart) {
! 		    post("fof: grain overflow");		   
! 		    x->neednewgrain = 0;  
! 	       }
! 	       else {
! 		    x->numgrains++;
! 		    x->grainend = newgrain->next;
! 		    newgrain->formphinc = formphinc;
! 		    newgrain->falling = 0;
! 		    newgrain->formph = newgrain->envph = 0.0;
! 		    x->neednewgrain = 0;  
! 	       }
! 	  }
! 
! 	  cur = x->grainstart;
! 	  while (cur != x->grainend) {
! 	       float formphase = cur->formph;
! 	       float envelope;
! 
! 	       float tph = (formphase - (float)((int) formphase));
! 	       float val = *(x->x_vec + (int) (tph * x->x_npoints));
! 
! 	       /* Apply the envelope */
! 
! 	       if (!cur->falling && (cur->envph <= 1.0)) { 
! 		    envelope = *(halfcos_table + (int) (cur->envph * COSTABSIZE));
! 		    cur->envph+=risinc;
! 		    val *= envelope;
! 	       }
! 	       else if (!cur->falling)
! 	       {
! 		    cur->falling = 1;
! 		    cur->envph = 0;
! 	       }
! 	       
! 
! 	       if (cur->falling) {
! 		    envelope = *(exp_table + (int) (cur->envph * COSTABSIZE));
! 		    cur->envph+=fallinc;
! 		    val *= envelope;
! 	       }		    
! 
! 	       /* end of envelope code */
! 
! 
! 	       formphase+=cur->formphinc;
! 	       cur->formph = formphase;
! 	       
! 	       if (formphase >= numperiods) { /* dead */
! 		    DEBUG("grain died",0);
! 		    x->grainstart = cur->next;
! 		    x->numgrains--;/* not needed */
! 	       }
! 	       
! 	       cur = cur->next;
! 	       *out += val;
! 	  }
! 	  
! 
! 	  if (fundphase > 1.0) {
! 	       fundphase -=  1.0;
! 	       x->neednewgrain=1;
! 	  }
! 	  out++;
!      }
! 
!      x->fundph=fundphase;
!      x->debug = 0;
! 
! 
!      return (w+5);
! }
! 
! void fofsynth_usearray(t_symbol* s,int* points,t_float** vec)
! {
!      t_garray *a;
!      if (!(a = (t_garray *)pd_findbyclass(s, garray_class))) 
! 	  error("%s: no such array", s->s_name);
!      else if (!garray_getfloatarray(a,points,vec))
! 	  error("%s: bad template for fof~", s->s_name);
!      else
! 	  garray_usedindsp(a); 
! }
! 
! static void fofsynth_dsp(t_fofsynth *x, t_signal **sp)
! {
!      
!      if (x->x_arrayname)
! 	  fofsynth_usearray(x->x_arrayname,&x->x_npoints, &x->x_vec);	
!      else {
! 	  x->x_npoints=COSTABSIZE;
! 	  x->x_vec = cos_table;
!      }
!                
!      dsp_add(fofsynth_perform, 4, x,
! 	     sp[0]->s_vec,sp[1]->s_vec, sp[0]->s_n);
! }
! 
! 
! static void fofsynth_free(t_fofsynth *x)
! {
!      freebytes(x->grainbase,sizeof(t_grain)*x->maxgrains);
! }
! 
! 
! static void fofsynth_debug(t_fofsynth* x)
! {
!      x->debug = 1;
! }
! 
! 
! static void fofsynth_float(t_fofsynth* x,t_float f)
! {
! 	x->fundfreq = f > 0.0 ? f : -f;
! }
! 
! 
! static void *fofsynth_new(t_symbol* s,t_float a,t_float b,t_float c,t_float d)
! {
!      int maxgrains = MAXGRAINS;
!      t_fofsynth *x = (t_fofsynth *)pd_new(fofsynth_class);
! 
!      x->debug = 0;
!      x->x_arrayname = s;
! 
!      if (s == &s_)
! 	  x->x_arrayname = NULL;
! 
!      /* setup the grain queue */
!      
!      x->grainbase = getbytes(sizeof(t_grain)*maxgrains);
!      x->maxgrains = maxgrains;
!      grain_makecyclic(x->grainbase,maxgrains);
!      x->grainstart = x->grainbase;
!      x->grainend = x->grainbase;    
!      x->numgrains = 0;
! 
!      /* some of them could be signals too */
! 
!      floatinlet_new(&x->x_obj, &x->formfreq);
!      floatinlet_new(&x->x_obj, &x->risedur);
!      floatinlet_new(&x->x_obj, &x->falldur);
! 
!      x->fundph = 0.0; 
!      x->fundfreq = 200.0;
!      x->formfreq = 600.0; 
!      x->risedur = 5.0; 
!      x->falldur = 140.0; 
! 
!      if (a) x->fundfreq = a;
!      if (b) x->formfreq = b; 
!      if (c) x->risedur = c; 
!      if (d) x->falldur = d; 
! 
!      outlet_new(&x->x_obj, &s_signal);
!      return (x);
! }
! 
! void fofsynth_tilde_setup(void)
! {
!      cos_table = NULL;
!      halfcos_table = NULL;
!      fofsynth_class = class_new(gensym("fof~"), (t_newmethod) fofsynth_new,(t_method) fofsynth_free,
! 				sizeof(t_fofsynth), 0,A_DEFSYM, A_DEFFLOAT,A_DEFFLOAT,A_DEFFLOAT,A_DEFFLOAT,0);
!      class_addcreator((t_newmethod)fofsynth_new,gensym("fofsynth~"),A_DEFSYM, A_DEFFLOAT,A_DEFFLOAT,A_DEFFLOAT,A_DEFFLOAT,0);
!      class_addmethod(fofsynth_class, nullfn, gensym("signal"), 0);
!      class_addmethod(fofsynth_class, (t_method) fofsynth_dsp, gensym("dsp"), 0);
!      class_addfloat(fofsynth_class, (t_method) fofsynth_float);
!      class_addmethod(fofsynth_class,(t_method) fofsynth_debug, gensym("debug"),0);
!      cos_maketable();
!      halfcos_maketable();
!      exp_maketable();
! }





More information about the Pd-cvs mailing list