aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/xsample/source/groove.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'externals/grill/xsample/source/groove.cpp')
-rw-r--r--externals/grill/xsample/source/groove.cpp65
1 files changed, 41 insertions, 24 deletions
diff --git a/externals/grill/xsample/source/groove.cpp b/externals/grill/xsample/source/groove.cpp
index b3779a04..241146c6 100644
--- a/externals/grill/xsample/source/groove.cpp
+++ b/externals/grill/xsample/source/groove.cpp
@@ -46,6 +46,8 @@ public:
V m_xzone(F xz);
V m_xsymm(F xz);
V m_xshape(I argc = 0,const t_atom *argv = NULL);
+ inline V ms_xshape(const AtomList &ret) { m_xshape(ret.Count(),ret.Atoms()); }
+ V mg_xshape(AtomList &ret) const;
V m_xkeep(BL k);
enum xs_loop {
@@ -62,6 +64,8 @@ protected:
I bidir;
F _xzone,xzone,xsymm;
+ I xshape;
+ F xshparam;
F znmin,znmax;
I xkeep;
S **znbuf;
@@ -70,8 +74,8 @@ protected:
outlet *outmin,*outmax; // float outlets
- V outputmin() { ToOutFloat(outmin,curmin*s2u); }
- V outputmax() { ToOutFloat(outmax,curmax*s2u); }
+ inline V outputmin() { ToOutFloat(outmin,curmin*s2u); }
+ inline V outputmax() { ToOutFloat(outmax,curmax*s2u); }
inline V setpos(F pos)
{
@@ -80,7 +84,7 @@ protected:
curpos = pos;
}
- V mg_pos(F &v) const { v = curpos*s2u; }
+ inline V mg_pos(F &v) const { v = curpos*s2u; }
private:
static V setup(t_classid c);
@@ -110,10 +114,13 @@ private:
FLEXT_CALLBACK_F(m_max)
FLEXT_CALLBACK(m_all)
- FLEXT_CALLBACK_F(m_xzone)
- FLEXT_CALLBACK_F(m_xsymm)
- FLEXT_CALLBACK_V(m_xshape)
- FLEXT_CALLBACK_B(m_xkeep)
+ FLEXT_CALLSET_F(m_xzone)
+ FLEXT_ATTRGET_F(_xzone)
+ FLEXT_CALLSET_F(m_xsymm)
+ FLEXT_ATTRGET_F(xsymm)
+ FLEXT_CALLVAR_V(mg_xshape,ms_xshape)
+ FLEXT_CALLSET_B(m_xkeep)
+ FLEXT_ATTRGET_B(xkeep)
FLEXT_CALLVAR_F(mg_pos,m_pos)
FLEXT_CALLSET_F(m_min)
@@ -128,7 +135,7 @@ FLEXT_LIB_DSP_V("xgroove~",xgroove)
V xgroove::setup(t_classid c)
{
-// DefineHelp(c,"xgroove~");
+ DefineHelp(c,"xgroove~");
FLEXT_CADDMETHOD_(c,0,"all",m_all);
FLEXT_CADDMETHOD(c,1,m_min);
@@ -140,15 +147,16 @@ V xgroove::setup(t_classid c)
FLEXT_CADDATTR_VAR_E(c,"loop",loopmode,m_loop);
- FLEXT_CADDMETHOD_F(c,0,"xzone",m_xzone);
- FLEXT_CADDMETHOD_F(c,0,"xsymm",m_xsymm);
- FLEXT_CADDMETHOD_(c,0,"xshape",m_xshape);
- FLEXT_CADDMETHOD_B(c,0,"xkeep",m_xkeep);
+ FLEXT_CADDATTR_VAR(c,"xzone",_xzone,m_xzone);
+ FLEXT_CADDATTR_VAR(c,"xsymm",xsymm,m_xsymm);
+ FLEXT_CADDATTR_VAR(c,"xshape",mg_xshape,ms_xshape);
+ FLEXT_CADDATTR_VAR(c,"xkeep",xkeep,m_xkeep);
}
xgroove::xgroove(I argc,const t_atom *argv):
loopmode(xsl_loop),curpos(0),
_xzone(0),xzone(0),xsymm(0.5),xkeep(0),pblksz(0),
+ xshape(0),xshparam(1),
znbuf(NULL),znmul(NULL),znidx(NULL),znpos(NULL),
bidir(1)
{
@@ -181,7 +189,7 @@ xgroove::xgroove(I argc,const t_atom *argv):
AddInFloat("Ending point"); // max play pos
for(I ci = 0; ci < outchns; ++ci) {
C tmp[30];
- sprintf(tmp,"Audio signal channel %i",ci+1);
+ STD::sprintf(tmp,"Audio signal channel %i",ci+1);
AddOutSignal(tmp); // output
}
AddOutSignal("Position currently played"); // position
@@ -270,7 +278,7 @@ BL xgroove::m_reset()
V xgroove::m_xzone(F xz)
{
bufchk();
- _xzone = xz < 0?0:xz/s2u;
+ _xzone = xz < 0?0:xz;
do_xzone();
s_dsp();
}
@@ -291,23 +299,24 @@ V xgroove::m_xsymm(F xs)
V xgroove::m_xshape(I argc,const t_atom *argv)
{
const F pi = 3.14159265358979f;
- I i,sh = 0;
- F param = 1;
- if(argc >= 1 && CanbeInt(argv[0])) sh = GetAInt(argv[0]);
+ xshape = 0;
+ xshparam = 1;
+ if(argc >= 1 && CanbeInt(argv[0])) xshape = GetAInt(argv[0]);
if(argc >= 2 && CanbeFloat(argv[1])) {
- param = GetAFloat(argv[1]);
+ xshparam = GetAFloat(argv[1]);
// clip to 0..1
- if(param < 0) param = 0;
- else if(param > 1) param = 1;
+ if(xshparam < 0) xshparam = 0;
+ else if(xshparam > 1) xshparam = 1;
}
if(znmul) delete[] znmul;
znmul = new S[XZONE_TABLE+1];
- switch(sh) {
+ I i;
+ switch(xshape) {
case 1:
for(i = 0; i <= XZONE_TABLE; ++i)
- znmul[i] = sin(i*(pi/2./XZONE_TABLE))*param+i*(1./XZONE_TABLE)*(1-param);
+ znmul[i] = sin(i*(pi/2./XZONE_TABLE))*xshparam+i*(1./XZONE_TABLE)*(1-xshparam);
break;
case 0:
default:
@@ -316,6 +325,14 @@ V xgroove::m_xshape(I argc,const t_atom *argv)
}
}
+V xgroove::mg_xshape(AtomList &ret) const
+{
+ ret(2);
+ SetInt(ret[0],xshape);
+ SetFloat(ret[1],xshparam);
+}
+
+
V xgroove::m_xkeep(BL k)
{
xkeep = k;
@@ -324,7 +341,7 @@ V xgroove::m_xkeep(BL k)
V xgroove::do_xzone()
{
- xzone = _xzone;
+ xzone = _xzone/s2u;
I smin = curmin,smax = curmax,plen = smax-smin; //curlen;
if(xsymm < 0) {
// crossfade zone is inside the loop (-> loop is shorter than nominal!)
@@ -632,7 +649,7 @@ V xgroove::m_help()
#ifdef FLEXT_DEBUG
post("compiled on " __DATE__ " " __TIME__);
#endif
- post("(C) Thomas Grill, 2001-2002");
+ post("(C) Thomas Grill, 2001-2003");
#if FLEXT_SYS == FLEXT_SYS_MAX
post("Arguments: %s [channels=1] [buffer]",thisName());
#else