[PD-cvs] externals/sc4pd/source AllpassC.cpp,NONE,1.1 AllpassL.cpp,NONE,1.1 AllpassN.cpp,NONE,1.1 main.cpp,1.18,1.19
Tim Blechmann
timblech at users.sourceforge.net
Wed Aug 4 20:23:17 CEST 2004
Update of /cvsroot/pure-data/externals/sc4pd/source
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11639/source
Modified Files:
main.cpp
Added Files:
AllpassC.cpp AllpassL.cpp AllpassN.cpp
Log Message:
some allpass delay lines
Index: main.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/sc4pd/source/main.cpp,v
retrieving revision 1.18
retrieving revision 1.19
diff -C2 -d -r1.18 -r1.19
*** main.cpp 4 Aug 2004 16:43:26 -0000 1.18
--- main.cpp 4 Aug 2004 18:23:15 -0000 1.19
***************
*** 61,65 ****
" Integrator(~), Decay~, Decay2~, Lag~, Lag2~, LinExp(~), "
"DelayN~,\n"
! " DelayL~, DelayC~, CombN~, CombL~"
);
--- 61,68 ----
" Integrator(~), Decay~, Decay2~, Lag~, Lag2~, LinExp(~), "
"DelayN~,\n"
! " DelayL~, DelayC~, CombN~, CombL~, CombC~, AllpassN~, "
! "AllpassL~,\n"
! " AllpassC~"
! "\n"
);
***************
*** 218,221 ****
--- 221,232 ----
FLEXT_DSP_SETUP(CombL_ar);
+
+ FLEXT_DSP_SETUP(CombC_ar);
+
+ FLEXT_DSP_SETUP(AllpassN_ar);
+
+ FLEXT_DSP_SETUP(AllpassL_ar);
+
+ FLEXT_DSP_SETUP(AllpassC_ar);
}
--- NEW FILE: AllpassN.cpp ---
/* sc4pd
AllpassN~
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: Efzeg: Boogie
*/
#include "sc4pd.hpp"
#include "DelayUnit.hpp"
class AllpassN_ar : public FeedbackDelay_ar
{
FLEXT_HEADER(AllpassN_ar,FeedbackDelay_ar);
AllpassN_ar (int argc, t_atom *argv);
~AllpassN_ar ();
protected:
virtual void m_signal(int n, t_sample *const *in, t_sample *const *out)
{
m_signal_fun(n,in,out);
}
virtual void m_dsp(int n, t_sample *const *in, t_sample *const *out)
{
delay_changed = decay_changed = false;
FeedbackDelay_Reset();
}
void m_delay(float f)
{
m_delaytime=f;
delay_changed = true;
}
void m_decay(float f)
{
m_decaytime=f;
decay_changed = true;
}
private:
bool delay_changed, decay_changed;
DEFSIGCALL(m_signal_fun);
DEFSIGFUN(m_signal_);
DEFSIGFUN(m_signal_z);
FLEXT_CALLBACK_F(m_delay);
FLEXT_CALLBACK_F(m_decay);
};
FLEXT_LIB_DSP_V("AllpassN~",AllpassN_ar);
AllpassN_ar::AllpassN_ar (int argc, t_atom *argv)
{
FLEXT_ADDMETHOD_(0,"delaytime",m_delay);
FLEXT_ADDMETHOD_(0,"decaytime",m_decay);
//parse arguments
AtomList Args(argc,argv);
if (Args.Count() != 3)
{
post("3 arguments are needed");
return;
}
m_maxdelaytime = sc_getfloatarg(Args,0);
m_delaytime = sc_getfloatarg(Args,1);
m_decaytime = sc_getfloatarg(Args,2);
SETSIGFUN(m_signal_fun,SIGFUN(m_signal_z));
AddOutSignal();
}
AllpassN_ar::~AllpassN_ar ()
{
DelayUnit_Dtor();
}
void AllpassN_ar::m_signal_z(int n, t_sample *const *in, t_sample *const *out)
{
t_sample *nin = *in;
t_sample *nout = *out;
float *dlybuf = m_dlybuf;
long iwrphase = m_iwrphase;
float dsamp = m_dsamp;
float feedbk = m_feedbk;
long mask = m_mask;
if (delay_changed)
{
float next_dsamp = CalcDelay(m_delaytime);
float dsamp_slope = CALCSLOPE(next_dsamp, dsamp);
float next_feedbk = CalcFeedback(m_delaytime, m_decaytime);
float feedbk_slope = CALCSLOPE(next_feedbk, feedbk);
for (int i = 0; i!= n;++i)
{
dsamp += dsamp_slope;
long irdphase = iwrphase - (long)dsamp;
if (irdphase < 0)
{
float dwr = ZXP(nin);
dlybuf[iwrphase & mask] = dwr;
ZXP(nout) = -feedbk * dwr;
}
else
{
float value = dlybuf[irdphase & mask];
float dwr = feedbk * value + ZXP(nin);
dlybuf[iwrphase & mask] = dwr;
ZXP(nout) = value - feedbk * dwr;
}
feedbk += feedbk_slope;
iwrphase++;
}
m_feedbk = feedbk;
m_dsamp = dsamp;
delay_changed = decay_changed = false;
}
else
{
long irdphase = iwrphase - (long)dsamp;
float* dlybuf1 = dlybuf - ZOFF;
float* dlyN = dlybuf1 + m_idelaylen;
if (decay_changed)
{
float next_feedbk = CalcFeedback(m_delaytime, m_decaytime);
float feedbk_slope = CALCSLOPE(next_feedbk, feedbk);
long remain = n;
while (remain)
{
float* dlywr = dlybuf1 + (iwrphase & mask);
float* dlyrd = dlybuf1 + (irdphase & mask);
long rdspace = dlyN - dlyrd;
long wrspace = dlyN - dlywr;
long nsmps = sc_min(rdspace, wrspace);
nsmps = sc_min(remain, nsmps);
remain -= nsmps;
if (irdphase < 0)
{
dlyrd += nsmps;
for (int i = 0; i!= nsmps;++i)
{
float dwr = ZXP(nin);
ZXP(dlywr) = dwr;
ZXP(nout) = -feedbk * dwr;
feedbk += feedbk_slope;
}
}
else
{
for (int i = 0; i!= nsmps;++i)
{
float x1 = ZXP(dlyrd);
float dwr = x1 * feedbk + ZXP(nin);
ZXP(dlywr) = dwr;
ZXP(nout) = x1 - feedbk * dwr;
feedbk += feedbk_slope;
}
}
iwrphase += nsmps;
irdphase += nsmps;
}
decay_changed=false;
}
else
{
long remain = n;
while (remain)
{
float* dlyrd = dlybuf1 + (irdphase & mask);
float* dlywr = dlybuf1 + (iwrphase & mask);
long rdspace = dlyN - dlyrd;
long wrspace = dlyN - dlywr;
long nsmps = sc_min(rdspace, wrspace);
nsmps = sc_min(remain, nsmps);
remain -= nsmps;
if (irdphase < 0)
{
feedbk = -feedbk;
for (int i = 0; i!= nsmps;++i)
{
float dwr = ZXP(nin);
ZXP(dlywr) = dwr;
ZXP(nout) = feedbk * dwr;
}
feedbk = -feedbk;
}
else
{
for (int i = 0; i!= nsmps;++i)
{
float x1 = ZXP(dlyrd);
float dwr = x1 * feedbk + ZXP(nin);
ZXP(dlywr) = dwr;
ZXP(nout) = x1 - feedbk * dwr;
}
}
iwrphase += nsmps;
irdphase += nsmps;
}
m_feedbk = feedbk;
}
}
m_iwrphase = iwrphase;
m_numoutput += n;
if (m_numoutput >= m_idelaylen)
{
SETSIGFUN(m_signal_fun,SIGFUN(m_signal_));
}
}
void AllpassN_ar::m_signal_(int n, t_sample *const *in, t_sample *const *out)
{
t_sample *nin = *in;
t_sample *nout = *out;
float *dlybuf = m_dlybuf;
long iwrphase = m_iwrphase;
float dsamp = m_dsamp;
float feedbk = m_feedbk;
long mask = m_mask;
if(delay_changed)
{
float next_dsamp = CalcDelay(m_delaytime);
float dsamp_slope = CALCSLOPE(next_dsamp, dsamp);
float next_feedbk = CalcFeedback(m_delaytime, m_decaytime);
float feedbk_slope = CALCSLOPE(next_feedbk, feedbk);
for(int i=0; i!= n;++i)
{
dsamp += dsamp_slope;
++iwrphase;
long irdphase = iwrphase - (long)dsamp;
float value = dlybuf[irdphase & mask];
float dwr = value * feedbk + ZXP(nin);
dlybuf[iwrphase & mask] = dwr;
ZXP(nout) = value - feedbk * dwr;
feedbk += feedbk_slope;
}
m_feedbk = feedbk;
m_dsamp = dsamp;
delay_changed = decay_changed = false;
}
else
{
long irdphase = iwrphase - (long)dsamp;
float* dlybuf1 = dlybuf - ZOFF;
float* dlyrd = dlybuf1 + (irdphase & mask);
float* dlywr = dlybuf1 + (iwrphase & mask);
float* dlyN = dlybuf1 + m_idelaylen;
if(decay_changed)
{
float next_feedbk = CalcFeedback(m_delaytime, m_decaytime);
float feedbk_slope = CALCSLOPE(next_feedbk, feedbk);
long remain = n;
while (remain)
{
long rdspace = dlyN - dlyrd;
long wrspace = dlyN - dlywr;
long nsmps = sc_min(rdspace, wrspace);
nsmps = sc_min(remain, nsmps);
remain -= nsmps;
for(int i=0; i!= nsmps;++i)
{
float value = ZXP(dlyrd);
float dwr = value * feedbk + ZXP(nin);
ZXP(dlywr) = dwr;
ZXP(nout) = value - feedbk * dwr;
feedbk += feedbk_slope;
}
if (dlyrd == dlyN) dlyrd = dlybuf1;
if (dlywr == dlyN) dlywr = dlybuf1;
}
m_feedbk = feedbk;
decay_changed = false;
}
else
{
long remain = n;
while (remain)
{
long rdspace = dlyN - dlyrd;
long wrspace = dlyN - dlywr;
long nsmps = sc_min(rdspace, wrspace);
nsmps = sc_min(remain, nsmps);
remain -= nsmps;
for (int i = 0; i!= nsmps; ++i)
{
float value = ZXP(dlyrd);
float dwr = value * feedbk + ZXP(nin);
ZXP(dlywr) = dwr;
ZXP(nout) = value - feedbk * dwr;
}
if (dlyrd == dlyN) dlyrd = dlybuf1;
if (dlywr == dlyN) dlywr = dlybuf1;
}
}
iwrphase += n;
}
m_iwrphase = iwrphase;
}
/* todo: AllpassN for control rate ? */
--- NEW FILE: AllpassL.cpp ---
/* sc4pd
AllpassL~
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: Rashid Ali & Frank Lowe: Duo Exchange
*/
#include "sc4pd.hpp"
#include "DelayUnit.hpp"
class AllpassL_ar : public FeedbackDelay_ar
{
FLEXT_HEADER(AllpassL_ar,FeedbackDelay_ar);
AllpassL_ar (int argc, t_atom *argv);
~AllpassL_ar ();
protected:
virtual void m_signal(int n, t_sample *const *in, t_sample *const *out)
{
m_signal_fun(n,in,out);
}
virtual void m_dsp(int n, t_sample *const *in, t_sample *const *out)
{
delay_changed = decay_changed = false;
FeedbackDelay_Reset();
}
void m_delay(float f)
{
m_delaytime=f;
delay_changed = true;
}
void m_decay(float f)
{
m_decaytime=f;
decay_changed = true;
}
private:
bool delay_changed, decay_changed;
DEFSIGCALL(m_signal_fun);
DEFSIGFUN(m_signal_);
DEFSIGFUN(m_signal_z);
FLEXT_CALLBACK_F(m_delay);
FLEXT_CALLBACK_F(m_decay);
};
FLEXT_LIB_DSP_V("AllpassL~",AllpassL_ar);
AllpassL_ar::AllpassL_ar (int argc, t_atom *argv)
{
FLEXT_ADDMETHOD_(0,"delaytime",m_delay);
FLEXT_ADDMETHOD_(0,"decaytime",m_decay);
//parse arguments
AtomList Args(argc,argv);
if (Args.Count() != 3)
{
post("3 arguments are needed");
return;
}
m_maxdelaytime = sc_getfloatarg(Args,0);
m_delaytime = sc_getfloatarg(Args,1);
m_decaytime = sc_getfloatarg(Args,2);
SETSIGFUN(m_signal_fun,SIGFUN(m_signal_z));
AddOutSignal();
}
AllpassL_ar::~AllpassL_ar ()
{
DelayUnit_Dtor();
}
void AllpassL_ar::m_signal_z(int n, t_sample *const *in, t_sample *const *out)
{
t_sample *nin = *in;
t_sample *nout = *out;
float *dlybuf = m_dlybuf;
long iwrphase = m_iwrphase;
float dsamp = m_dsamp;
float feedbk = m_feedbk;
long mask = m_mask;
if (delay_changed || decay_changed)
{
float next_dsamp = CalcDelay(m_delaytime);
float dsamp_slope = CALCSLOPE(next_dsamp, dsamp);
float next_feedbk = CalcFeedback(m_delaytime, m_decaytime);
float feedbk_slope = CALCSLOPE(next_feedbk, feedbk);
for (int i = 0; i!= n;++i)
{
dsamp += dsamp_slope;
long idsamp = (long)dsamp;
float frac = dsamp - idsamp;
long irdphase = iwrphase - idsamp;
long irdphaseb = irdphase - 1;
float zin = ZXP(nin);
if (irdphase < 0)
{
dlybuf[iwrphase & mask] = zin;
ZXP(nout) = - feedbk * zin; //check: probably a bug = 0?
}
else if (irdphaseb < 0)
{
float d1 = dlybuf[irdphase & mask];
float value = d1 - frac * d1;
float dwr = zin + feedbk * value;
dlybuf[iwrphase & mask] = dwr;
ZXP(nout) = value - feedbk * dwr;
}
else
{
float d1 = dlybuf[irdphase & mask];
float d2 = dlybuf[irdphaseb & mask];
float value = lininterp(frac, d1, d2);
float dwr = zin + feedbk * value;
dlybuf[iwrphase & mask] = dwr;
ZXP(nout) = value - feedbk * dwr;
}
feedbk += feedbk_slope;
iwrphase++;
}
m_feedbk = feedbk;
m_dsamp = dsamp;
delay_changed = decay_changed = false;
}
else
{
long idsamp = (long)dsamp;
float frac = dsamp - idsamp;
float zin = ZXP(nin);
for (int i = 0; i!= n;++i)
{
long irdphase = iwrphase - idsamp;
long irdphaseb = irdphase - 1;
float zin = ZXP(nin);
if (irdphase < 0)
{
dlybuf[iwrphase & mask] = zin;
ZXP(nout) = - feedbk * zin;
}
else if (irdphaseb < 0)
{
float d1 = dlybuf[irdphase & mask];
float value = d1 - frac * d1;
float dwr = zin + feedbk * value;
dlybuf[iwrphase & mask] = dwr;
ZXP(nout) = value - feedbk * dwr;
}
else
{
float d1 = dlybuf[irdphase & mask];
float d2 = dlybuf[irdphaseb & mask];
float value = lininterp(frac, d1, d2);
float dwr = zin + feedbk * value;
dlybuf[iwrphase & mask] = dwr;
ZXP(nout) = value - feedbk * dwr;
}
iwrphase++;
}
}
m_iwrphase = iwrphase;
m_numoutput += n;
if (m_numoutput >= m_idelaylen)
{
SETSIGFUN(m_signal_fun,SIGFUN(m_signal_));
}
}
void AllpassL_ar::m_signal_(int n, t_sample *const *in, t_sample *const *out)
{
t_sample *nin = *in;
t_sample *nout = *out;
float *dlybuf = m_dlybuf;
long iwrphase = m_iwrphase;
float dsamp = m_dsamp;
float feedbk = m_feedbk;
long mask = m_mask;
if(delay_changed || decay_changed)
{
float next_dsamp = CalcDelay(m_delaytime);
float dsamp_slope = CALCSLOPE(next_dsamp, dsamp);
float next_feedbk = CalcFeedback(m_delaytime, m_decaytime);
float feedbk_slope = CALCSLOPE(next_feedbk, feedbk);
for(int i=0; i!= n;++i)
{
dsamp += dsamp_slope;
long idsamp = (long)dsamp;
float frac = dsamp - idsamp;
long irdphase = iwrphase - idsamp;
long irdphaseb = irdphase - 1;
float d1 = dlybuf[irdphase & mask];
float d2 = dlybuf[irdphaseb & mask];
float value = lininterp(frac, d1, d2);
float dwr = ZXP(nin) + feedbk * value;
dlybuf[iwrphase & mask] = dwr;
ZXP(nout) = value - feedbk * dwr;
feedbk += feedbk_slope;
iwrphase++;
}
m_feedbk = feedbk;
m_dsamp = dsamp;
delay_changed = decay_changed = false;
}
else
{
long idsamp = (long)dsamp;
float frac = dsamp - idsamp;
for(int i=0; i!= n;++i)
{
long irdphase = iwrphase - idsamp;
long irdphaseb = irdphase - 1;
float d1 = dlybuf[irdphase & mask];
float d2 = dlybuf[irdphaseb & mask];
float value = lininterp(frac, d1, d2);
float dwr = ZXP(nin) + feedbk * value;
dlybuf[iwrphase & mask] = dwr;
ZXP(nout) = value - feedbk * dwr;
iwrphase++;
}
}
m_iwrphase = iwrphase;
}
/* todo: AllpassL for control rate ? */
--- NEW FILE: AllpassC.cpp ---
/* sc4pd
AllpassC~
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: Rashid Ali & Frank Lowe: Duo Exchange
*/
#include "sc4pd.hpp"
#include "DelayUnit.hpp"
class AllpassC_ar : public FeedbackDelay_ar
{
FLEXT_HEADER(AllpassC_ar,FeedbackDelay_ar);
AllpassC_ar (int argc, t_atom *argv);
~AllpassC_ar ();
protected:
virtual void m_signal(int n, t_sample *const *in, t_sample *const *out)
{
m_signal_fun(n,in,out);
}
virtual void m_dsp(int n, t_sample *const *in, t_sample *const *out)
{
delay_changed = decay_changed = false;
FeedbackDelay_Reset();
}
void m_delay(float f)
{
m_delaytime=f;
delay_changed = true;
}
void m_decay(float f)
{
m_decaytime=f;
decay_changed = true;
}
private:
bool delay_changed, decay_changed;
DEFSIGCALL(m_signal_fun);
DEFSIGFUN(m_signal_);
DEFSIGFUN(m_signal_z);
FLEXT_CALLBACK_F(m_delay);
FLEXT_CALLBACK_F(m_decay);
};
FLEXT_LIB_DSP_V("AllpassC~",AllpassC_ar);
AllpassC_ar::AllpassC_ar (int argc, t_atom *argv)
{
FLEXT_ADDMETHOD_(0,"delaytime",m_delay);
FLEXT_ADDMETHOD_(0,"decaytime",m_decay);
//parse arguments
AtomList Args(argc,argv);
if (Args.Count() != 3)
{
post("3 arguments are needed");
return;
}
m_maxdelaytime = sc_getfloatarg(Args,0);
m_delaytime = sc_getfloatarg(Args,1);
m_decaytime = sc_getfloatarg(Args,2);
SETSIGFUN(m_signal_fun,SIGFUN(m_signal_z));
AddOutSignal();
}
AllpassC_ar::~AllpassC_ar ()
{
DelayUnit_Dtor();
}
void AllpassC_ar::m_signal_z(int n, t_sample *const *in, t_sample *const *out)
{
t_sample *nin = *in;
t_sample *nout = *out;
float *dlybuf = m_dlybuf;
long iwrphase = m_iwrphase;
float dsamp = m_dsamp;
float feedbk = m_feedbk;
long mask = m_mask;
float d0, d1, d2, d3;
if (delay_changed || decay_changed)
{
float next_dsamp = CalcDelay(m_delaytime);
float dsamp_slope = CALCSLOPE(next_dsamp, dsamp);
float next_feedbk = CalcFeedback(m_delaytime, m_decaytime);
float feedbk_slope = CALCSLOPE(next_feedbk, feedbk);
for (int i = 0; i!= n;++i)
{
dsamp += dsamp_slope;
long idsamp = (long)dsamp;
float frac = dsamp - idsamp;
long irdphase1 = iwrphase - idsamp;
long irdphase2 = irdphase1 - 1;
long irdphase3 = irdphase1 - 2;
long irdphase0 = irdphase1 + 1;
if (irdphase0 < 0)
{
dlybuf[iwrphase & mask] = ZXP(nin);
ZXP(nout) = 0.f;
}
else
{
if (irdphase1 < 0)
{
d1 = d2 = d3 = 0.f;
d0 = dlybuf[irdphase0 & mask];
}
else if (irdphase2 < 0)
{
d1 = d2 = d3 = 0.f;
d0 = dlybuf[irdphase0 & mask];
d1 = dlybuf[irdphase1 & mask];
}
else if (irdphase3 < 0)
{
d3 = 0.f;
d0 = dlybuf[irdphase0 & mask];
d1 = dlybuf[irdphase1 & mask];
d2 = dlybuf[irdphase2 & mask];
}
else
{
d0 = dlybuf[irdphase0 & mask];
d1 = dlybuf[irdphase1 & mask];
d2 = dlybuf[irdphase2 & mask];
d3 = dlybuf[irdphase3 & mask];
}
float value = cubicinterp(frac, d0, d1, d2, d3);
float dwr = ZXP(nin) + feedbk * value;
dlybuf[iwrphase & mask] = dwr;
ZXP(nout) = value - feedbk * dwr;
}
feedbk += feedbk_slope;
iwrphase++;
}
m_feedbk = feedbk;
m_dsamp = dsamp;
delay_changed = decay_changed = false;
}
else
{
long idsamp = (long)dsamp;
float frac = dsamp - idsamp;
for (int i = 0; i!= n;++i)
{
long irdphase1 = iwrphase - idsamp;
long irdphase2 = irdphase1 - 1;
long irdphase3 = irdphase1 - 2;
long irdphase0 = irdphase1 + 1;
if (irdphase0 < 0)
{
dlybuf[iwrphase & mask] = ZXP(nin);
ZXP(nout) = 0.f;
}
else
{
if (irdphase1 < 0)
{
d1 = d2 = d3 = 0.f;
d0 = dlybuf[irdphase0 & mask];
}
else if (irdphase2 < 0)
{
d1 = d2 = d3 = 0.f;
d0 = dlybuf[irdphase0 & mask];
d1 = dlybuf[irdphase1 & mask];
}
else if (irdphase3 < 0)
{
d3 = 0.f;
d0 = dlybuf[irdphase0 & mask];
d1 = dlybuf[irdphase1 & mask];
d2 = dlybuf[irdphase2 & mask];
}
else
{
d0 = dlybuf[irdphase0 & mask];
d1 = dlybuf[irdphase1 & mask];
d2 = dlybuf[irdphase2 & mask];
d3 = dlybuf[irdphase3 & mask];
}
float value = cubicinterp(frac, d0, d1, d2, d3);
float dwr = ZXP(nin) + feedbk * value;
dlybuf[iwrphase & mask] = dwr;
ZXP(nout) = value - feedbk * dwr;
}
iwrphase++;
}
}
m_iwrphase = iwrphase;
m_numoutput += n;
if (m_numoutput >= m_idelaylen)
{
SETSIGFUN(m_signal_fun,SIGFUN(m_signal_));
}
}
void AllpassC_ar::m_signal_(int n, t_sample *const *in, t_sample *const *out)
{
t_sample *nin = *in;
t_sample *nout = *out;
float *dlybuf = m_dlybuf;
long iwrphase = m_iwrphase;
float dsamp = m_dsamp;
float feedbk = m_feedbk;
long mask = m_mask;
float d0, d1, d2, d3;
if(delay_changed || decay_changed)
{
float next_dsamp = CalcDelay(m_delaytime);
float dsamp_slope = CALCSLOPE(next_dsamp, dsamp);
float next_feedbk = CalcFeedback(m_delaytime, m_decaytime);
float feedbk_slope = CALCSLOPE(next_feedbk, feedbk);
for(int i=0; i!= n;++i)
{
dsamp += dsamp_slope;
long idsamp = (long)dsamp;
float frac = dsamp - idsamp;
long irdphase1 = iwrphase - idsamp;
long irdphase2 = irdphase1 - 1;
long irdphase3 = irdphase1 - 2;
long irdphase0 = irdphase1 + 1;
float d0 = dlybuf[irdphase0 & mask];
float d1 = dlybuf[irdphase1 & mask];
float d2 = dlybuf[irdphase2 & mask];
float d3 = dlybuf[irdphase3 & mask];
float value = cubicinterp(frac, d0, d1, d2, d3);
float dwr = ZXP(nin) + feedbk * value;
dlybuf[iwrphase & mask] = dwr;
ZXP(nout) = value - feedbk * dwr;
feedbk += feedbk_slope;
iwrphase++;
}
m_feedbk = feedbk;
m_dsamp = dsamp;
delay_changed = decay_changed = false;
}
else
{
long idsamp = (long)dsamp;
float frac = dsamp - idsamp;
for(int i=0; i!= n;++i)
{
long irdphase1 = iwrphase - idsamp;
long irdphase2 = irdphase1 - 1;
long irdphase3 = irdphase1 - 2;
long irdphase0 = irdphase1 + 1;
float d0 = dlybuf[irdphase0 & mask];
float d1 = dlybuf[irdphase1 & mask];
float d2 = dlybuf[irdphase2 & mask];
float d3 = dlybuf[irdphase3 & mask];
float value = cubicinterp(frac, d0, d1, d2, d3);
float dwr = ZXP(nin) + feedbk * value;
dlybuf[iwrphase & mask] = dwr;
ZXP(nout) = value - feedbk * dwr;
iwrphase++;
}
}
m_iwrphase = iwrphase;
}
/* todo: AllpassC for control rate ? */
More information about the Pd-cvs
mailing list