[PD-cvs] externals/sc4pd/source BPF.cpp,NONE,1.1 BRF.cpp,NONE,1.1 main.cpp,1.24,1.25
Tim Blechmann
timblech at users.sourceforge.net
Sun Aug 8 18:29:28 CEST 2004
Update of /cvsroot/pure-data/externals/sc4pd/source
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11508/source
Modified Files:
main.cpp
Added Files:
BPF.cpp BRF.cpp
Log Message:
brf & bpf
Index: main.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/sc4pd/source/main.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -C2 -d -r1.24 -r1.25
*** main.cpp 8 Aug 2004 11:10:30 -0000 1.24
--- main.cpp 8 Aug 2004 16:29:26 -0000 1.25
***************
*** 65,69 ****
" AllpassC~, PitchShift~, Resonz~, OnePole(~), OneZero(~), "
"TwoPole~, \n"
! " TwoZero~, FOS(~), SOS~, RLPF~, RHPF~, LPF~, HPF~"
"\n"
);
--- 65,70 ----
" AllpassC~, PitchShift~, Resonz~, OnePole(~), OneZero(~), "
"TwoPole~, \n"
! " TwoZero~, FOS(~), SOS~, RLPF~, RHPF~, LPF~, HPF~, BPF~, "
! "BRF~"
"\n"
);
***************
*** 258,261 ****
--- 259,266 ----
FLEXT_DSP_SETUP(HPF_ar);
+
+ FLEXT_DSP_SETUP(BPF_ar);
+
+ FLEXT_DSP_SETUP(BRF_ar);
}
--- NEW FILE: BPF.cpp ---
/* sc4pd
BPF~
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: Jo Kondo: Works For Piano
*/
#include "sc4pd.hpp"
/* ------------------------ BPF~ -------------------------------*/
class BPF_ar:
public sc4pd_dsp
{
FLEXT_HEADER(BPF_ar,sc4pd_dsp);
public:
BPF_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)
{
mRadiansPerSample = sc_radianspersample();
mFilterSlope = sc_filterslope();
mFilterLoops = sc_filterloops();
mFilterRemain = sc_filterremain();
}
void m_set_freq(float f)
{
m_freq=f;
changed = true;
}
void m_set_rq(float f)
{
m_bw=f;
changed = true;
}
private:
float m_y1, m_y2, m_a0, m_b1, m_b2, m_freq, m_bw;
bool changed;
float mRadiansPerSample, mFilterSlope;
int mFilterLoops, mFilterRemain;
FLEXT_CALLBACK_F(m_set_freq);
FLEXT_CALLBACK_F(m_set_rq);
};
FLEXT_LIB_DSP_V("BPF~",BPF_ar);
BPF_ar::BPF_ar(int argc, t_atom *argv)
{
FLEXT_ADDMETHOD_(0,"kfreq",m_set_freq);
FLEXT_ADDMETHOD_(0,"krq",m_set_rq);
//parse arguments
AtomList Args(argc,argv);
m_freq = sc_getfloatarg(Args,0);
m_bw = sc_getfloatarg(Args,1);
changed = true;
AddOutSignal();
m_a0 = 0.f;
m_b1 = 0.f;
m_b2 = 0.f;
m_y1 = 0.f;
m_y2 = 0.f;
}
void BPF_ar::m_signal(int n, t_sample *const *in,
t_sample *const *out)
{
t_sample *nin = *in;
t_sample *nout = *out;
float y0;
float y1 = m_y1;
float y2 = m_y2;
float a0 = m_a0;
float b1 = m_b1;
float b2 = m_b2;
if (changed)
{
float pfreq = m_freq * mRadiansPerSample;
float pbw = m_bw * pfreq * 0.5;
float C = 1.f / tan(pbw);
float D = 2.f * cos(pfreq);
float next_a0 = 1.f / (1.f + C);
float next_b1 = C * D * next_a0 ;
float next_b2 = (1.f - C) * next_a0;
float a0_slope = (next_a0 - a0) * mFilterSlope;
float b1_slope = (next_b1 - b1) * mFilterSlope;
float b2_slope = (next_b2 - b2) * mFilterSlope;
for (int i = 0; i!= mFilterLoops;++i)
{
y0 = ZXP(nin) + b1 * y1 + b2 * y2;
ZXP(nout) = a0 * (y0 - y2);
y2 = ZXP(nin) + b1 * y0 + b2 * y1;
ZXP(nout) = a0 * (y2 - y1);
y1 = ZXP(nin) + b1 * y2 + b2 * y0;
ZXP(nout) = a0 * (y1 - y0);
a0 += a0_slope;
b1 += b1_slope;
b2 += b2_slope;
}
for (int i = 0; i!= mFilterRemain;++i)
{
y0 = ZXP(nin) + b1 * y1 + b2 * y2;
ZXP(nout) = a0 * (y0 - y2);
y2 = y1;
y1 = y0;
}
m_a0 = a0;
m_b1 = b1;
m_b2 = b2;
changed = false;
}
else
{
for (int i = 0; i!= mFilterLoops;++i)
{
y0 = ZXP(nin) + b1 * y1 + b2 * y2;
ZXP(nout) = a0 * (y0 - y2);
y2 = ZXP(nin) + b1 * y0 + b2 * y1;
ZXP(nout) = a0 * (y2 - y1);
y1 = ZXP(nin) + b1 * y2 + b2 * y0;
ZXP(nout) = a0 * (y1 - y0);
}
for (int i = 0; i!= mFilterRemain;++i)
{
y0 = ZXP(nin) + b1 * y1 + b2 * y2;
ZXP(nout) = a0 * (y0 - y2);
y2 = y1;
y1 = y0;
}
}
m_y1 = zapgremlins(y1);
m_y2 = zapgremlins(y2);
}
/* no control rate BPF filter */
--- NEW FILE: BRF.cpp ---
/* sc4pd
BRF~
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: Jo Kondo: Works For Piano
*/
#include "sc4pd.hpp"
/* ------------------------ BRF~ -------------------------------*/
class BRF_ar:
public sc4pd_dsp
{
FLEXT_HEADER(BRF_ar,sc4pd_dsp);
public:
BRF_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)
{
mRadiansPerSample = sc_radianspersample();
mFilterSlope = sc_filterslope();
mFilterLoops = sc_filterloops();
mFilterRemain = sc_filterremain();
}
void m_set_freq(float f)
{
m_freq=f;
changed = true;
}
void m_set_rq(float f)
{
m_bw=f;
changed = true;
}
private:
float m_y1, m_y2, m_a0, m_a1, m_b2, m_freq, m_bw;
bool changed;
float mRadiansPerSample, mFilterSlope;
int mFilterLoops, mFilterRemain;
FLEXT_CALLBACK_F(m_set_freq);
FLEXT_CALLBACK_F(m_set_rq);
};
FLEXT_LIB_DSP_V("BRF~",BRF_ar);
BRF_ar::BRF_ar(int argc, t_atom *argv)
{
FLEXT_ADDMETHOD_(0,"kfreq",m_set_freq);
FLEXT_ADDMETHOD_(0,"krq",m_set_rq);
//parse arguments
AtomList Args(argc,argv);
m_freq = sc_getfloatarg(Args,0);
m_bw = sc_getfloatarg(Args,1);
changed = true;
AddOutSignal();
m_a0 = 0.f;
m_a1 = 0.f;
m_b2 = 0.f;
m_y1 = 0.f;
m_y2 = 0.f;
}
void BRF_ar::m_signal(int n, t_sample *const *in,
t_sample *const *out)
{
t_sample *nin = *in;
t_sample *nout = *out;
float ay;
float y0;
float y1 = m_y1;
float y2 = m_y2;
float a0 = m_a0;
float a1 = m_a1;
float b2 = m_b2;
if (changed)
{
float pfreq = m_freq * mRadiansPerSample;
float pbw = m_bw * pfreq * 0.5;
float C = tan(pbw);
float D = 2.f * cos(pfreq);
float next_a0 = 1.f / (1.f + C);
float next_a1 = -D * next_a0;
float next_b2 = (1.f - C) * next_a0;
float a0_slope = (next_a0 - a0) * mFilterSlope;
float a1_slope = (next_a1 - a1) * mFilterSlope;
float b2_slope = (next_b2 - b2) * mFilterSlope;
for (int i = 0; i!= mFilterLoops;++i)
{
ay = a1 * y1;
y0 = ZXP(nin) - ay - b2 * y2;
ZXP(nout) = a0 * (y0 + y2) + ay;
ay = a1 * y0;
y2 = ZXP(nin) - ay - b2 * y1;
ZXP(nout) = a0 * (y2 + y1) + ay;
ay = a1 * y2;
y1 = ZXP(nin) - ay - b2 * y0;
ZXP(nout) = a0 * (y1 + y0) + ay;
a0 += a0_slope;
a1 += a1_slope;
b2 += b2_slope;
}
for (int i = 0; i!= mFilterRemain;++i)
{
ay = a1 * y1;
y0 = ZXP(nin) - ay - b2 * y2;
ZXP(nout) = a0 * (y0 + y2) + ay;
y2 = y1;
y1 = y0;
}
m_a0 = a0;
m_a1 = a1;
m_b2 = b2;
changed = false;
}
else
{
for (int i = 0; i!= mFilterLoops;++i)
{
ay = a1 * y1;
y0 = ZXP(nin) - ay - b2 * y2;
ZXP(nout) = a0 * (y0 + y2) + ay;
ay = a1 * y0;
y2 = ZXP(nin) - ay - b2 * y1;
ZXP(nout) = a0 * (y2 + y1) + ay;
ay = a1 * y2;
y1 = ZXP(nin) - ay - b2 * y0;
ZXP(nout) = a0 * (y1 + y0) + ay;
}
for (int i = 0; i!= mFilterRemain;++i)
{
ay = a1 * y1;
y0 = ZXP(nin) - ay - b2 * y2;
ZXP(nout) = a0 * (y0 + y2) + ay;
y2 = y1;
y1 = y0;
}
}
m_y1 = zapgremlins(y1);
m_y2 = zapgremlins(y2);
}
/* no control rate BRF filter */
More information about the Pd-cvs
mailing list