494 lines · 12.8 KB · C++
RawDownload
//-----------------------------------------------------------------------------// Entaro ChucK Developer!// This is a Chugin boilerplate, generated by chugerate!//----------------------------------------------------------------------------- // this should align with the correct versions of these ChucK files#include "chuck_dl.h"#include "chuck_def.h"#include "ulib_math.h" #include "Spectacle-dsp.h" // general includes#include <stdio.h>#include <limits.h> // declaration of chugin constructorCK_DLL_CTOR(spectacle_ctor);// declaration of chugin desctructorCK_DLL_DTOR(spectacle_dtor); // example of getter/setterCK_DLL_MFUN(spectacle_setParam);CK_DLL_MFUN(spectacle_getParam); CK_DLL_MFUN(spectacle_setFFTlen);CK_DLL_MFUN(spectacle_getFFTlen); CK_DLL_MFUN(spectacle_setOverlap);CK_DLL_MFUN(spectacle_getOverlap); CK_DLL_MFUN(spectacle_setMaxDelay);CK_DLL_MFUN(spectacle_getMaxDelay); CK_DLL_MFUN(spectacle_clear); CK_DLL_MFUN(spectacle_setHold);CK_DLL_MFUN(spectacle_getHold); CK_DLL_MFUN(spectacle_setPostEQ);CK_DLL_MFUN(spectacle_getPostEQ); CK_DLL_MFUN(spectacle_setMinFreq);CK_DLL_MFUN(spectacle_getMinFreq); CK_DLL_MFUN(spectacle_setMaxFreq);CK_DLL_MFUN(spectacle_getMaxFreq); CK_DLL_MFUN(spectacle_setFreqRange); // for Chugins extending UGen, this is mono synthesis function for 1 sampleCK_DLL_TICKF(spectacle_tick); // this is a special offset reserved for Chugin internal datat_CKINT spectacle_data_offset = 0; #define CONFORM_INPUT#define CLIP(a, lo, hi) ( (a)>(lo)?( (a)<(hi)?(a):(hi) ):(lo) )  #define kDefaultFFTLen           1024#define kDefaultWindowLen        2048#define kDefaultOverlap          2#define kDefaultMaxDelTime       6.0f#define kMinMaxDelTime           0.1f#define kMaxMaxDelTime           20.0f#define kMaxTableLen             512 // class definition for internal Chugin data// (note: this isn't strictly necessary, but serves as example// of one recommended approach)class Spectacle{public:  // constructor  Spectacle( t_CKFLOAT fs)  {    m_param = 0;    fftlen = kDefaultFFTLen;    windowlen = kDefaultWindowLen;    overlap = kDefaultOverlap;    maxdeltime = kDefaultMaxDelTime;    maxdeltime = CLIP(maxdeltime, kMinMaxDelTime, kMaxMaxDelTime);    srate = fs;    spectdelay = NULL;    float *del = dttable;    float *eq = eqtable;    float *feed = fbtable;    int *bm = eqbinmap;    int *dbm = delaybinmap;    for (int i = 0; i < kMaxTableLen; i++)      {	*del++ = 0.0;	*eq++ = 0.0;	*feed++ = 0.0;	*bm++ = 0;	*dbm++ = 0;      }    dttablen = eqtablen = fbtablen = 0;    eqbinmaplen = delaybinmaplen = 0;    dminfreq = dmaxfreq = minfreq = maxfreq = 0.0;    posteq = hold = false;        spectdelay = new Spectacle_dsp();    spectdelay->init(fftlen, windowlen, overlap, srate, maxdeltime);  }   ~Spectacle()  {    delete spectdelay;  }   // for Chugins extending UGen  void tick( SAMPLE* in, SAMPLE* out, int nframes)  {    memset (out, 0, sizeof(SAMPLE)*nframes);	for (int i=0; i<nframes; i+=2)	  {		spectdelay->run(in+i, out+i, 1);		spectdelay->run(in+i, out+i+1, 1);	  }    // process a block of samples    //spectdelay->run(in, out, nframes);  }   void clear()  {	printf ( "Spectacle: cleared.\n" );    spectdelay->clear();  }    // set parameter example  float setParam( t_CKFLOAT p )  {    m_param = p;    return p;  }    // get parameter example  float getParam() { return m_param; }   float setMaxDelay ( t_CKDUR p)  {    float dt = (p / srate);    dt = CLIP(dt, kMinMaxDelTime, kMaxMaxDelTime);	if (dt > maxdeltime)	  {		// pin existing delay times to new maximum		for (int i = 0; i < dttablen; i++)		  {			if (dttable[i] > dt)			  dttable[i] = dt;		  }	  }    maxdeltime = dt;    spectdelay->set_maxdeltime(dt);    return p;  }   float getMaxDelay ()  {    return (maxdeltime * srate);  }   // set parameter example  int setHold( t_CKINT p )  {	if (p > 1 || p < 0)	  {		p = 1;		printf ("Spectacle: hold must be 0 or 1\n");	  }	hold = p;	spectdelay->set_hold(p);    return p;  }    // get parameter example  int getHold() { return hold; }   // set parameter example  int setPostEQ( t_CKINT p )  {	if (p > 1 || p < 0)	  {		p = 1;		printf ("Spectacle: posteq must be 0 or 1\n");	  }	posteq = p;	spectdelay->set_posteq(p);    return p;  }    // get parameter example  int getPostEQ() { return posteq; }   // set parameter example  int setFFTlen( t_CKINT p )  {	clear();	int newfft = 1;	// ensure it's a power of 2	while (newfft < p) newfft = newfft << 1;	fftlen = newfft;	windowlen = newfft * 2;    spectdelay->init(fftlen, windowlen, overlap, srate, maxdeltime);    return fftlen;  }   int getFFTlen() { return fftlen; };   // set parameter example  int setOverlap( t_CKINT p )  {	clear();	overlap = p;    spectdelay->init(fftlen, windowlen, overlap, srate, maxdeltime);    return overlap;  }   int getOverlap() { return overlap; };  private:  // instance data  float m_param;    int fftlen, windowlen, overlap;  float srate, maxdeltime;  Spectacle_dsp *spectdelay;  float eqtable[kMaxTableLen];  float dttable[kMaxTableLen];  float fbtable[kMaxTableLen];  int eqbinmap[kMaxTableLen];  int delaybinmap[kMaxTableLen];  int eqtablen, dttablen, fbtablen, eqbinmaplen, delaybinmaplen;  float minfreq, maxfreq, dminfreq, dmaxfreq;  bool hold, posteq;   float rand2f (float min, float max)  {    return min + (max-min)*(::random()/(t_CKFLOAT)CK_RANDOM_MAX);  } };  // query function: chuck calls this when loading the Chugin// NOTE: developer will need to modify this function to// add additional functions to this ChuginCK_DLL_QUERY( Spectacle ){  // hmm, don't change this...  QUERY->setname(QUERY, "Spectacle");    // begin the class definition  // can change the second argument to extend a different ChucK class  QUERY->begin_class(QUERY, "Spectacle", "UGen");    // register the constructor (probably no need to change)  QUERY->add_ctor(QUERY, spectacle_ctor);  // register the destructor (probably no need to change)  QUERY->add_dtor(QUERY, spectacle_dtor);    // for UGen's only: add tick function  QUERY->add_ugen_funcf(QUERY, spectacle_tick, NULL, 8, 8);    // NOTE: if this is to be a UGen with more than 1 channel,   // e.g., a multichannel UGen -- will need to use add_ugen_funcf()  // and declare a tickf function using CK_DLL_TICKF    // example of adding setter method  QUERY->add_mfun(QUERY, spectacle_setParam, "float", "param");  // example of adding argument to the above method  QUERY->add_arg(QUERY, "float", "arg");   // example of adding getter method  QUERY->add_mfun(QUERY, spectacle_getParam, "float", "param");   // example of adding setter method  QUERY->add_mfun(QUERY, spectacle_clear, "void", "clear");   // example of adding setter method  QUERY->add_mfun(QUERY, spectacle_setHold, "int", "hold");  // example of adding argument to the above method  QUERY->add_arg(QUERY, "int", "arg");   // example of adding setter method  QUERY->add_mfun(QUERY, spectacle_getHold, "int", "hold");   // example of adding setter method  QUERY->add_mfun(QUERY, spectacle_setPostEQ, "int", "posteq");  // example of adding argument to the above method  QUERY->add_arg(QUERY, "int", "arg");   // example of adding setter method  QUERY->add_mfun(QUERY, spectacle_getPostEQ, "int", "posteq");   // example of adding setter method  QUERY->add_mfun(QUERY, spectacle_setFFTlen, "int", "fftlen");  // example of adding argument to the above method  QUERY->add_arg(QUERY, "int", "arg");   // example of adding setter method  QUERY->add_mfun(QUERY, spectacle_getFFTlen, "int", "fftlen");   // example of adding setter method  QUERY->add_mfun(QUERY, spectacle_setOverlap, "int", "overlap");  // example of adding argument to the above method  QUERY->add_arg(QUERY, "int", "arg");   // example of adding setter method  QUERY->add_mfun(QUERY, spectacle_getOverlap, "int", "overlap");   // example of adding setter method  QUERY->add_mfun(QUERY, spectacle_setMaxDelay, "dur", "setMaxDelay");  // example of adding argument to the above method  QUERY->add_arg(QUERY, "dur", "delay");   // example of adding setter method  QUERY->add_mfun(QUERY, spectacle_getMaxDelay, "dur", "getMaxDelay");    // this reserves a variable in the ChucK internal class to store   // referene to the c++ class we defined above  spectacle_data_offset = QUERY->add_mvar(QUERY, "int", "@s_data", false);    // end the class definition  // IMPORTANT: this MUST be called!  QUERY->end_class(QUERY);    // wasn't that a breeze?  return TRUE;}  // implementation for the constructorCK_DLL_CTOR(spectacle_ctor){  // get the offset where we'll store our internal c++ class pointer  OBJ_MEMBER_INT(SELF, spectacle_data_offset) = 0;    // instantiate our internal c++ class representation  Spectacle * bcdata = new Spectacle(API->vm->get_srate());    // store the pointer in the ChucK object member  OBJ_MEMBER_INT(SELF, spectacle_data_offset) = (t_CKINT) bcdata;}  // implementation for the destructorCK_DLL_DTOR(spectacle_dtor){  // get our c++ class pointer  Spectacle * bcdata = (Spectacle *) OBJ_MEMBER_INT(SELF, spectacle_data_offset);  // check it  if( bcdata )    {      // clean up      delete bcdata;      OBJ_MEMBER_INT(SELF, spectacle_data_offset) = 0;      bcdata = NULL;    }}  // implementation for tick functionCK_DLL_TICKF(spectacle_tick){  // get our c++ class pointer  Spectacle * c = (Spectacle *) OBJ_MEMBER_INT(SELF, spectacle_data_offset);    // invoke our tick function; store in the magical out variable  if(c) c->tick(in,out, nframes);   // yes  return TRUE;}  // example implementation for setterCK_DLL_MFUN(spectacle_setParam){  // get our c++ class pointer  Spectacle * bcdata = (Spectacle *) OBJ_MEMBER_INT(SELF, spectacle_data_offset);  // set the return value  RETURN->v_float = bcdata->setParam(GET_NEXT_FLOAT(ARGS));}  // example implementation for getterCK_DLL_MFUN(spectacle_getParam){  // get our c++ class pointer  Spectacle * bcdata = (Spectacle *) OBJ_MEMBER_INT(SELF, spectacle_data_offset);  // set the return value  RETURN->v_float = bcdata->getParam();} // example implementation for setterCK_DLL_MFUN(spectacle_setMaxDelay){  // get our c++ class pointer  Spectacle * bcdata = (Spectacle *) OBJ_MEMBER_INT(SELF, spectacle_data_offset);  // set the return value  RETURN->v_dur = bcdata->setMaxDelay(GET_NEXT_DUR(ARGS));} // example implementation for setterCK_DLL_MFUN(spectacle_getMaxDelay){  // get our c++ class pointer  Spectacle * bcdata = (Spectacle *) OBJ_MEMBER_INT(SELF, spectacle_data_offset);  // set the return value  RETURN->v_dur = bcdata->getMaxDelay();} // example implementation for setterCK_DLL_MFUN(spectacle_clear){  // get our c++ class pointer  Spectacle * bcdata = (Spectacle *) OBJ_MEMBER_INT(SELF, spectacle_data_offset);  // set the return value  bcdata->clear();} // example implementation for setterCK_DLL_MFUN(spectacle_setHold){  // get our c++ class pointer  Spectacle * bcdata = (Spectacle *) OBJ_MEMBER_INT(SELF, spectacle_data_offset);  // set the return value  RETURN->v_int = bcdata->setHold(GET_NEXT_INT(ARGS));} // example implementation for setterCK_DLL_MFUN(spectacle_getHold){  // get our c++ class pointer  Spectacle * bcdata = (Spectacle *) OBJ_MEMBER_INT(SELF, spectacle_data_offset);  // set the return value  RETURN->v_int = bcdata->getHold();} // example implementation for setterCK_DLL_MFUN(spectacle_setPostEQ){  // get our c++ class pointer  Spectacle * bcdata = (Spectacle *) OBJ_MEMBER_INT(SELF, spectacle_data_offset);  // set the return value  RETURN->v_int = bcdata->setPostEQ(GET_NEXT_INT(ARGS));} // example implementation for setterCK_DLL_MFUN(spectacle_getPostEQ){  // get our c++ class pointer  Spectacle * bcdata = (Spectacle *) OBJ_MEMBER_INT(SELF, spectacle_data_offset);  // set the return value  RETURN->v_int = bcdata->getPostEQ();} // example implementation for setterCK_DLL_MFUN(spectacle_setFFTlen){  // get our c++ class pointer  Spectacle * bcdata = (Spectacle *) OBJ_MEMBER_INT(SELF, spectacle_data_offset);  // set the return value  RETURN->v_int = bcdata->setFFTlen(GET_NEXT_INT(ARGS));} // example implementation for setterCK_DLL_MFUN(spectacle_getFFTlen){  // get our c++ class pointer  Spectacle * bcdata = (Spectacle *) OBJ_MEMBER_INT(SELF, spectacle_data_offset);  // set the return value  RETURN->v_int = bcdata->getFFTlen();} // example implementation for setterCK_DLL_MFUN(spectacle_setOverlap){  // get our c++ class pointer  Spectacle * bcdata = (Spectacle *) OBJ_MEMBER_INT(SELF, spectacle_data_offset);  // set the return value  RETURN->v_int = bcdata->setOverlap(GET_NEXT_INT(ARGS));} // example implementation for setterCK_DLL_MFUN(spectacle_getOverlap){  // get our c++ class pointer  Spectacle * bcdata = (Spectacle *) OBJ_MEMBER_INT(SELF, spectacle_data_offset);  // set the return value  RETURN->v_int = bcdata->getOverlap();}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t