Update of /cvsroot/pure-data/externals/sc4pd/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30080/source
Modified Files: main.cpp sc4pd.hpp support.cpp support.hpp Added Files: LFDNoise0.cpp LFDNoise1.cpp LFDNoise2.cpp sc*.cpp sc+.cpp sc-.cpp scdiv.cpp Log Message: lfdnoises and interpolating vector/scalar operations
Index: support.hpp =================================================================== RCS file: /cvsroot/pure-data/externals/sc4pd/source/support.hpp,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** support.hpp 8 Aug 2004 11:10:30 -0000 1.8 --- support.hpp 9 Sep 2004 08:45:18 -0000 1.9 *************** *** 51,54 **** --- 51,55 ---- float sc_getfloatarg (flext::AtomList a,int i); bool sc_ar(flext::AtomList a); + bool sc_inv(flext::AtomList a);
*************** *** 95,99 ****
! /* this is copied from thomas grill's xsample: xsample - extended sample objects for Max/MSP and pd (pure data)
--- 96,100 ----
! /* this is adapted from thomas grill's xsample: xsample - extended sample objects for Max/MSP and pd (pure data)
*************** *** 103,134 **** */
- #define F float - #define D double - #define I int - #define L long - #define C char - #define V void - #define BL bool - #define S t_sample - #define SETSIGFUN(VAR,FUN) v_##VAR = FUN
! #define DEFSIGFUN(NAME) V NAME(I n,S *const *in,S *const *out)
#define DEFSIGCALL(NAME) \ ! inline V NAME(I n,S *const *in,S *const *out) \ { (this->*v_##NAME)(n,in,out); } \ ! V (thisType::*v_##NAME)(I n,S *const *invecs,S *const *outvecs)
#define SIGFUN(FUN) &thisType::FUN
- #undef F - #undef D - #undef I - #undef L - #undef C - #undef V - #undef BL - #undef S
--- 104,118 ---- */
#define SETSIGFUN(VAR,FUN) v_##VAR = FUN
! #define DEFSIGFUN(NAME) void NAME(int n,t_sample *const *in,t_sample *const *out)
#define DEFSIGCALL(NAME) \ ! inline void NAME(int n,t_sample *const *in,t_sample *const *out) \ { (this->*v_##NAME)(n,in,out); } \ ! void (thisType::*v_##NAME)(int n,t_sample *const *invecs,t_sample *const *outvecs)
#define SIGFUN(FUN) &thisType::FUN
--- NEW FILE: sc-.cpp --- /* sc4pd sc-~
Copyright (c) 2004 Tim Blechmann.
This code is derived from: SuperCollider real time audio synthesis system Copyright (c) 2002 James McCartney. All rights reserved. http://www.audiosynth.com
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Based on: PureData by Miller Puckette and others. http://www.crca.ucsd.edu/~msp/software.html FLEXT by Thomas Grill http://www.parasitaere-kapazitaeten.net/ext SuperCollider by James McCartney http://www.audiosynth.com
Coded while listening to: Phil Minton & Veryan Weston: Ways
*/
#include "sc4pd.hpp"
/* ------------------------ sc-~ -------------------------------*/
class scsub_ar: public sc4pd_dsp { FLEXT_HEADER(scsub_ar,sc4pd_dsp);
public: scsub_ar(int argc, t_atom *argv);
protected: virtual void m_signal(int n, t_sample *const *in, t_sample *const *out);
void m_set(float f) { m_nextsubtrahend = f; changed = true; }
float m_nextsubtrahend, m_subtrahend; bool changed; bool invert;
private: FLEXT_CALLBACK_1(m_set,float); };
FLEXT_LIB_DSP_V("sc-~",scsub_ar);
scsub_ar::scsub_ar(int argc, t_atom *argv) { FLEXT_ADDMETHOD(1,m_set);
//parse arguments AtomList Args(argc,argv);
m_subtrahend = sc_getfloatarg(Args,0);
invert = sc_inv(Args);
AddInSignal("signal"); AddInFloat("scalar"); AddOutSignal();
changed = false; }
void scsub_ar::m_signal(int n, t_sample *const *in, t_sample *const *out) { t_sample *nin = *in; t_sample *nout = *out;
if (invert) { if (changed) { float xb = m_nextsubtrahend; float slope = CALCSLOPE(xb, m_subtrahend); for (int i = 0; i!=n; ++i) { ZXP(nout) = xb - ZXP(nin); xb += slope; } m_subtrahend = xb; changed = false; } else { float xb = m_subtrahend; for (int i = 0; i!=n; ++i) { ZXP(nout) = xb - ZXP(nin); } } } else { if (changed) { float xb = m_nextsubtrahend; float slope = CALCSLOPE(xb, m_subtrahend); for (int i = 0; i!=n; ++i) { ZXP(nout) = ZXP(nin) - xb; xb += slope; } m_subtrahend = xb; changed = false; } else { float xb = m_subtrahend; for (int i = 0; i!=n; ++i) { ZXP(nout) = ZXP(nin) - xb; } } } }
Index: main.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/sc4pd/source/main.cpp,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** main.cpp 8 Aug 2004 17:30:20 -0000 1.26 --- main.cpp 9 Sep 2004 08:45:18 -0000 1.27 *************** *** 67,72 **** " TwoZero~, FOS(~), SOS~, RLPF~, RHPF~, LPF~, HPF~, BPF~, " "BRF~,\n" ! " LPZ1(~), HPZ1(~), LPZ2(~), HPZ2(~), BPZ2(~), BRZ2(~)" ! "\n" );
--- 67,73 ---- " TwoZero~, FOS(~), SOS~, RLPF~, RHPF~, LPF~, HPF~, BPF~, " "BRF~,\n" ! " LPZ1(~), HPZ1(~), LPZ2(~), HPZ2(~), BPZ2(~), BRZ2(~), " ! "LFDNoise0~,\n" ! " LFDNoise1~, LFDNoise2~, sc+~, sc-~, sc*~, sc/~\n" );
*************** *** 282,285 **** --- 283,300 ---- FLEXT_DSP_SETUP(BPZ2_ar); FLEXT_SETUP(BPZ2_kr); + + FLEXT_DSP_SETUP(LFDNoise0_ar); + + FLEXT_DSP_SETUP(LFDNoise1_ar); + + FLEXT_DSP_SETUP(LFDNoise2_ar); + + FLEXT_DSP_SETUP(scadd_ar); + + FLEXT_DSP_SETUP(scsub_ar); + + FLEXT_DSP_SETUP(scmul_ar); + + FLEXT_DSP_SETUP(scdiv_ar); }
--- NEW FILE: sc+.cpp --- /* sc4pd sc+~
Copyright (c) 2004 Tim Blechmann.
This code is derived from: SuperCollider real time audio synthesis system Copyright (c) 2002 James McCartney. All rights reserved. http://www.audiosynth.com
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Based on: PureData by Miller Puckette and others. http://www.crca.ucsd.edu/~msp/software.html FLEXT by Thomas Grill http://www.parasitaere-kapazitaeten.net/ext SuperCollider by James McCartney http://www.audiosynth.com
Coded while listening to: Phil Minton & Veryan Weston: Ways Past
*/
#include "sc4pd.hpp"
/* ------------------------ sc+~ -------------------------------*/
class scadd_ar: public sc4pd_dsp { FLEXT_HEADER(scadd_ar,sc4pd_dsp);
public: scadd_ar(int argc, t_atom *argv);
protected: virtual void m_signal(int n, t_sample *const *in, t_sample *const *out);
void m_set(float f) { m_nextsummand = f; changed = true; }
float m_nextsummand, m_summand; bool changed;
private: FLEXT_CALLBACK_1(m_set,float); };
FLEXT_LIB_DSP_V("sc+~",scadd_ar);
scadd_ar::scadd_ar(int argc, t_atom *argv) { FLEXT_ADDMETHOD(1,m_set);
//parse arguments AtomList Args(argc,argv);
m_summand = sc_getfloatarg(Args,0);
AddInSignal("signal"); AddInFloat("scalar"); AddOutSignal();
changed = false; }
void scadd_ar::m_signal(int n, t_sample *const *in, t_sample *const *out) { t_sample *nin = *in; t_sample *nout = *out;
if (changed) { float xb = m_nextsummand; float slope = CALCSLOPE(xb, m_summand); for (int i = 0; i!=n; ++i) { ZXP(nout) = ZXP(nin) + xb; xb += slope; } m_summand = xb; changed = false; } else { float xb = m_summand;
for (int i = 0; i!=n; ++i) { ZXP(nout) = ZXP(nin) + xb; } } }
--- NEW FILE: sc*.cpp --- /* sc4pd sc*~
Copyright (c) 2004 Tim Blechmann.
This code is derived from: SuperCollider real time audio synthesis system Copyright (c) 2002 James McCartney. All rights reserved. http://www.audiosynth.com
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Based on: PureData by Miller Puckette and others. http://www.crca.ucsd.edu/~msp/software.html FLEXT by Thomas Grill http://www.parasitaere-kapazitaeten.net/ext SuperCollider by James McCartney http://www.audiosynth.com
Coded while listening to: Phil Minton & Veryan Weston: Ways
*/
#include "sc4pd.hpp"
/* ------------------------ sc*~ -------------------------------*/
class scmul_ar: public sc4pd_dsp { FLEXT_HEADER(scmul_ar,sc4pd_dsp);
public: scmul_ar(int argc, t_atom *argv);
protected: virtual void m_signal(int n, t_sample *const *in, t_sample *const *out);
void m_set(float f) { m_nextfactor = f; changed = true; }
float m_nextfactor, m_factor; bool changed;
private: FLEXT_CALLBACK_1(m_set,float); };
FLEXT_LIB_DSP_V("sc*~",scmul_ar);
scmul_ar::scmul_ar(int argc, t_atom *argv) { FLEXT_ADDMETHOD(1,m_set);
//parse arguments AtomList Args(argc,argv);
m_factor = sc_getfloatarg(Args,0);
AddInSignal("signal"); AddInFloat("scalar"); AddOutSignal();
changed = false; }
void scmul_ar::m_signal(int n, t_sample *const *in, t_sample *const *out) { t_sample *nin = *in; t_sample *nout = *out;
if (changed) { float xb = m_nextfactor; float slope = CALCSLOPE(xb, m_factor); for (int i = 0; i!=n; ++i) { ZXP(nout) = ZXP(nin) * xb; xb += slope; } m_factor = xb; changed = false; } else { float xb = m_factor;
for (int i = 0; i!=n; ++i) { ZXP(nout) = ZXP(nin) * xb; } } }
--- NEW FILE: LFDNoise0.cpp --- /* sc4pd LFDNoise0~
Copyright (c) 2004 Tim Blechmann.
This code is derived from: SuperCollider real time audio synthesis system Copyright (c) 2002 James McCartney. All rights reserved. http://www.audiosynth.com
* * DynNoiseUGens.cpp * xSC3plugins * * Created by Alberto de Campo, Sekhar Ramacrishnan, Julian Rohrhuber on Sun May 30 2004. * Copyright (c) 2004 HfbK. All rights reserved. * *
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Based on: PureData by Miller Puckette and others. http://www.crca.ucsd.edu/~msp/software.html FLEXT by Thomas Grill http://www.parasitaere-kapazitaeten.net/ext SuperCollider by James McCartney http://www.audiosynth.com
Coded while listening to: Phil Minton & Veryan Weston: Ways Past
*/
#include "sc4pd.hpp"
/* ------------------------ LFDNoise0~ -------------------------------*/
class LFDNoise0_ar: public sc4pd_dsp { FLEXT_HEADER(LFDNoise0_ar,sc4pd_dsp);
public: LFDNoise0_ar(int argc, t_atom *argv);
protected: virtual void m_signal(int n, t_sample *const *in, t_sample *const *out); virtual void m_dsp(int n, t_sample *const *in, t_sample *const *out);
void m_seed(int i) { rgen.init(i); }
void m_set(float f) { m_freq = f; }
private: RGen rgen; float m_freq; float m_level; float m_phase; float m_smpdur;
bool m_ar;
FLEXT_CALLBACK_I(m_seed); FLEXT_CALLBACK_F(m_set); };
FLEXT_LIB_DSP_V("LFDNoise0~",LFDNoise0_ar);
LFDNoise0_ar::LFDNoise0_ar(int argc, t_atom *argv) { FLEXT_ADDMETHOD_(0,"seed",m_seed); FLEXT_ADDMETHOD_(0,"set",m_set);
//parse arguments AtomList Args(argc,argv);
m_freq = sc_getfloatarg(Args,0);
m_phase=0.f; m_level=0.f;
rgen.init(timeseed());
m_ar = sc_ar(Args);
if (m_ar) AddInSignal("freqency"); else AddInSignal(""set" frequency"); AddOutSignal(); }
void LFDNoise0_ar::m_dsp(int n, t_sample *const *in, t_sample *const *out) { m_smpdur = sc_sampledur(); }
void LFDNoise0_ar::m_signal(int n, t_sample *const *in, t_sample *const *out) { t_sample *nout = *out;
float level = m_level; float phase = m_phase;
RGET;
if (m_ar) { t_sample *nin = *in; float smpdur = m_smpdur; for (int i = 0; i!= n; ++i) { phase -= ZXP(nin) * smpdur; if (phase <= 0) { phase = sc_wrap(phase, 0.f, 1.f); level = frand2(s1,s2,s3); } ZXP(nout) = level; } } else { float dphase = m_smpdur * m_freq; for (int i = 0; i!= n; ++i) { phase -= dphase; if (phase <= 0) { phase = sc_wrap(phase, 0.f, 1.f); level = frand2(s1,s2,s3); } ZXP(nout) = level; } }
m_level = level; m_phase = phase;
RPUT; }
--- NEW FILE: LFDNoise2.cpp --- /* sc4pd LFDNoise2~
Copyright (c) 2004 Tim Blechmann.
This code is derived from: SuperCollider real time audio synthesis system Copyright (c) 2002 James McCartney. All rights reserved. http://www.audiosynth.com
* * DynNoiseUGens.cpp * xSC3plugins * * Created by Alberto de Campo, Sekhar Ramacrishnan, Julian Rohrhuber on Sun May 30 2004. * Copyright (c) 2004 HfbK. All rights reserved. * *
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Based on: PureData by Miller Puckette and others. http://www.crca.ucsd.edu/~msp/software.html FLEXT by Thomas Grill http://www.parasitaere-kapazitaeten.net/ext SuperCollider by James McCartney http://www.audiosynth.com
Coded while listening to: Phil Minton & Veryan Weston: Ways Past
*/
#include "sc4pd.hpp"
/* ------------------------ LFDNoise2~ -------------------------------*/
class LFDNoise2_ar: public sc4pd_dsp { FLEXT_HEADER(LFDNoise2_ar,sc4pd_dsp);
public: LFDNoise2_ar(int argc, t_atom *argv);
protected: virtual void m_signal(int n, t_sample *const *in, t_sample *const *out); virtual void m_dsp(int n, t_sample *const *in, t_sample *const *out);
void m_seed(int i) { rgen.init(i); }
void m_set(float f) { m_freq = f; }
private: RGen rgen; float m_freq; float m_levela, m_levelb, m_levelc, m_leveld; float m_phase; float m_smpdur;
bool m_ar;
FLEXT_CALLBACK_I(m_seed); FLEXT_CALLBACK_F(m_set); };
FLEXT_LIB_DSP_V("LFDNoise2~",LFDNoise2_ar);
LFDNoise2_ar::LFDNoise2_ar(int argc, t_atom *argv) { FLEXT_ADDMETHOD_(0,"seed",m_seed); FLEXT_ADDMETHOD_(0,"set",m_set);
//parse arguments AtomList Args(argc,argv);
m_freq = sc_getfloatarg(Args,0);
rgen.init(timeseed());
RGET;
m_phase=0.f; m_levela = frand2(s1, s2, s3) * 0.8f;// limits max interpol. overshoot to 1. m_levelb = frand2(s1, s2, s3) * 0.8f; m_levelc = frand2(s1, s2, s3) * 0.8f; m_leveld = frand2(s1, s2, s3) * 0.8f;
RPUT;
m_ar = sc_ar(Args);
if (m_ar) AddInSignal("freqency"); else AddInSignal(""set" frequency"); AddOutSignal(); }
void LFDNoise2_ar::m_dsp(int n, t_sample *const *in, t_sample *const *out) { m_smpdur = sc_sampledur(); }
void LFDNoise2_ar::m_signal(int n, t_sample *const *in, t_sample *const *out) { t_sample *nout = *out;
float a = m_levela; float b = m_levelb; float c = m_levelc; float d = m_leveld;
float phase = m_phase;
RGET;
if (m_ar) { t_sample *nin = *in; float smpdur = m_smpdur; for (int i = 0; i!= n; ++i) { phase -= ZXP(nin) * smpdur; if (phase <= 0) { phase = sc_wrap(phase, 0.f, 1.f); a = b; b = c; c = d; d = frand2(s1,s2,s3) * 0.8f; // limits max interpol. overshoot to 1.
} ZXP(nout) = cubicinterp(1.f - phase, a, b, c, d); } } else { float dphase = m_smpdur * m_freq; for (int i = 0; i!= n; ++i) { phase -= dphase; if (phase <= 0) { phase = sc_wrap(phase, 0.f, 1.f); a = b; b = c; c = d; d = frand2(s1,s2,s3) * 0.8f; // limits max interpol. overshoot to 1. } ZXP(nout) = cubicinterp(1.f - phase, a, b, c, d); } }
m_phase = phase;
m_levela = a; m_levelb = b; m_levelc = c; m_leveld = d;
RPUT; }
Index: support.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/sc4pd/source/support.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** support.cpp 2 Aug 2004 19:18:22 -0000 1.4 --- support.cpp 9 Sep 2004 08:45:18 -0000 1.5 *************** *** 78,91 **** }
! // macros to put rgen state in registers ! #define RGET \ ! uint32 s1 = rgen.s1; \ ! uint32 s2 = rgen.s2; \ ! uint32 s3 = rgen.s3; ! ! #define RPUT \ ! rgen.s1 = s1; \ ! rgen.s2 = s2; \ ! rgen.s3 = s3;
int32 timeseed() --- 78,95 ---- }
! bool sc_inv(flext::AtomList a) ! { ! for (int i = 0; i!=a.Count();++i) ! { ! if ( flext::IsSymbol(a[i]) ) ! { ! const char * teststring; ! teststring = flext::GetString(a[i]); ! if((strcmp(teststring,"inv"))==0) ! return true; ! } ! } ! return false; ! }
int32 timeseed()
--- NEW FILE: LFDNoise1.cpp --- /* sc4pd LFDNoise1~
Copyright (c) 2004 Tim Blechmann.
This code is derived from: SuperCollider real time audio synthesis system Copyright (c) 2002 James McCartney. All rights reserved. http://www.audiosynth.com
* * DynNoiseUGens.cpp * xSC3plugins * * Created by Alberto de Campo, Sekhar Ramacrishnan, Julian Rohrhuber on Sun May 30 2004. * Copyright (c) 2004 HfbK. All rights reserved. * *
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Based on: PureData by Miller Puckette and others. http://www.crca.ucsd.edu/~msp/software.html FLEXT by Thomas Grill http://www.parasitaere-kapazitaeten.net/ext SuperCollider by James McCartney http://www.audiosynth.com
Coded while listening to: Phil Minton & Veryan Weston: Ways Past
*/
#include "sc4pd.hpp"
/* ------------------------ LFDNoise1~ -------------------------------*/
class LFDNoise1_ar: public sc4pd_dsp { FLEXT_HEADER(LFDNoise1_ar,sc4pd_dsp);
public: LFDNoise1_ar(int argc, t_atom *argv);
protected: virtual void m_signal(int n, t_sample *const *in, t_sample *const *out); virtual void m_dsp(int n, t_sample *const *in, t_sample *const *out);
void m_seed(int i) { rgen.init(i); }
void m_set(float f) { m_freq = f; }
private: RGen rgen; float m_freq; float m_prevlevel; float m_nextlevel; float m_phase; float m_smpdur;
bool m_ar;
FLEXT_CALLBACK_I(m_seed); FLEXT_CALLBACK_F(m_set); };
FLEXT_LIB_DSP_V("LFDNoise1~",LFDNoise1_ar);
LFDNoise1_ar::LFDNoise1_ar(int argc, t_atom *argv) { FLEXT_ADDMETHOD_(0,"seed",m_seed); FLEXT_ADDMETHOD_(0,"set",m_set);
//parse arguments AtomList Args(argc,argv);
m_freq = sc_getfloatarg(Args,0);
rgen.init(timeseed());
m_phase=0.f; m_prevlevel=0.f; m_nextlevel = rgen.frand2();
m_ar = sc_ar(Args);
if (m_ar) AddInSignal("freqency"); else AddInSignal(""set" frequency"); AddOutSignal(); }
void LFDNoise1_ar::m_dsp(int n, t_sample *const *in, t_sample *const *out) { m_smpdur = sc_sampledur(); }
void LFDNoise1_ar::m_signal(int n, t_sample *const *in, t_sample *const *out) { t_sample *nout = *out;
float prevLevel = m_prevlevel; float nextLevel = m_nextlevel; float phase = m_phase;
RGET;
if (m_ar) { t_sample *nin = *in; float smpdur = m_smpdur; for (int i = 0; i!= n; ++i) { phase -= ZXP(nin) * smpdur; if (phase <= 0) { phase = sc_wrap(phase, 0.f, 1.f); prevLevel = nextLevel; nextLevel = frand2(s1,s2,s3); } ZXP(nout) = nextLevel + ( phase * (prevLevel - nextLevel) ); } } else { float dphase = m_smpdur * m_freq; for (int i = 0; i!= n; ++i) { phase -= dphase; if (phase <= 0) { phase = sc_wrap(phase, 0.f, 1.f); prevLevel = nextLevel; nextLevel = frand2(s1,s2,s3); } ZXP(nout) = nextLevel + ( phase * (prevLevel - nextLevel) ); } }
m_prevlevel = prevLevel; m_nextlevel = nextLevel; m_phase = phase;
RPUT; }
Index: sc4pd.hpp =================================================================== RCS file: /cvsroot/pure-data/externals/sc4pd/source/sc4pd.hpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** sc4pd.hpp 7 Aug 2004 20:43:57 -0000 1.5 --- sc4pd.hpp 9 Sep 2004 08:45:18 -0000 1.6 *************** *** 125,128 ****
! #define _SC$PD_HPP #endif --- 125,128 ----
! #define _SC4PD_HPP #endif
--- NEW FILE: scdiv.cpp --- /* sc4pd sc/~
Copyright (c) 2004 Tim Blechmann.
This code is derived from: SuperCollider real time audio synthesis system Copyright (c) 2002 James McCartney. All rights reserved. http://www.audiosynth.com
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Based on: PureData by Miller Puckette and others. http://www.crca.ucsd.edu/~msp/software.html FLEXT by Thomas Grill http://www.parasitaere-kapazitaeten.net/ext SuperCollider by James McCartney http://www.audiosynth.com
Coded while listening to: Phil Minton & Veryan Weston: Ways
*/
#include "sc4pd.hpp"
/* ------------------------ sc/~ -------------------------------*/
class scdiv_ar: public sc4pd_dsp { FLEXT_HEADER(scdiv_ar,sc4pd_dsp);
public: scdiv_ar(int argc, t_atom *argv);
protected: virtual void m_signal(int n, t_sample *const *in, t_sample *const *out);
void m_set(float f) { m_nextdivisor = f; changed = true; }
float m_nextdivisor, m_divisor; bool changed; bool invert;
private: FLEXT_CALLBACK_1(m_set,float); };
FLEXT_LIB_DSP_V("sc/~",scdiv_ar);
scdiv_ar::scdiv_ar(int argc, t_atom *argv) { FLEXT_ADDMETHOD(1,m_set);
//parse arguments AtomList Args(argc,argv);
m_divisor = sc_getfloatarg(Args,0);
invert = sc_inv(Args);
AddInSignal("signal"); AddInFloat("scalar"); AddOutSignal();
changed = false; }
void scdiv_ar::m_signal(int n, t_sample *const *in, t_sample *const *out) { t_sample *nin = *in; t_sample *nout = *out;
if (invert) { if (changed) { float xb = m_nextdivisor; float slope = CALCSLOPE(xb, m_divisor); for (int i = 0; i!=n; ++i) { ZXP(nout) = xb / ZXP(nin); xb += slope; } m_divisor = xb; changed = false; } else { float xb = m_divisor; for (int i = 0; i!=n; ++i) { ZXP(nout) = xb / ZXP(nin); } } } else { if (changed) { float xb = m_nextdivisor; float slope = CALCSLOPE(xb, m_divisor); for (int i = 0; i!=n; ++i) { ZXP(nout) = ZXP(nin) / xb; xb += slope; } m_divisor = xb; changed = false; } else { float xb = m_divisor; for (int i = 0; i!=n; ++i) { ZXP(nout) = ZXP(nin) / xb; } } } }