581 lines · 16.5 KB · C++
RawDownload
//-----------------------------------------------------------------------------// Entaro ChucK Developer!// This is a Chugin boilerplate, generated by chuginate!//----------------------------------------------------------------------------- // this should align with the correct versions of these ChucK files#include "chuck_dl.h"#include "chuck_def.h" #include "gverbdsp.h"#include "gverbdefs.h" // general includes#include <stdio.h>#include <limits.h>//#include <stdlib.h> // declaration of chugin constructorCK_DLL_CTOR(gverb_ctor);// declaration of chugin destructorCK_DLL_DTOR(gverb_dtor); // example of getter/setterCK_DLL_MFUN(gverb_setRoomsize);CK_DLL_MFUN(gverb_getRoomsize);CK_DLL_MFUN(gverb_setRevTime);CK_DLL_MFUN(gverb_getRevTime);CK_DLL_MFUN(gverb_setDamping);CK_DLL_MFUN(gverb_getDamping);CK_DLL_MFUN(gverb_setBandwidth);CK_DLL_MFUN(gverb_getBandwidth);CK_DLL_MFUN(gverb_setDryLevel);CK_DLL_MFUN(gverb_getDryLevel);CK_DLL_MFUN(gverb_setEarlyLevel);CK_DLL_MFUN(gverb_getEarlyLevel);CK_DLL_MFUN(gverb_setTailLevel);CK_DLL_MFUN(gverb_getTailLevel); // for Chugins extending UGen, this is mono synthesis function for 1 sampleCK_DLL_TICKF(gverb_tick); // this is a special offset reserved for Chugin internal datat_CKINT gverb_data_offset = 0;  // class definition for internal Chugin data// (note: this isn't strictly necessary, but serves as example// of one recommended approach)class GVerb{public:    // constructor    GVerb( t_CKFLOAT fs)    {            const float maxroomsize = 300.0f;      float roomsize = 30.0f;      float revtime = 5.0f;      float damping = 0.8f;      float spread = 15.0f;      float inputbandwidth = 0.5f;      float drylevel = 0.6f; //-1.9832f;      float earlylevel = 0.4f; //-1.9832f;      float taillevel = 0.5f;            float ga,gb,gt;      unsigned int i;      int n;      float r;      float diffscale;      int a,b,c,cc,d,dd,e;      float spread1,spread2;            p = &realp;      memset((void *)p, 0, sizeof (ty_gverb));      p->rate = fs;            p->fdndamping = damping;      p->maxroomsize = maxroomsize;      p->roomsize = CLIP(roomsize, 0.1f, maxroomsize);      p->revtime = revtime;      p->drylevel = drylevel;      p->earlylevel = earlylevel;      p->taillevel = taillevel;            p->maxdelay = p->rate*p->maxroomsize/340.0;      p->largestdelay = p->rate*p->roomsize/340.0;            /* Input damper */            p->inputbandwidth = inputbandwidth;      p->inputdamper = damper_make(1.0 - p->inputbandwidth);         	/* FDN section */ 	p->fdndels = (ty_fixeddelay **)malloc(FDNORDER*sizeof(ty_fixeddelay *));	for(i = 0; i < FDNORDER; i++)	{		p->fdndels[i] = fixeddelay_make((int)p->maxdelay+1000);	}	p->fdngains = (float *)malloc(FDNORDER*sizeof(float));	p->fdnlens = (int *)malloc(FDNORDER*sizeof(int)); 	p->fdndamps = (ty_damper **)malloc(FDNORDER*sizeof(ty_damper *)); 	for(i = 0; i < FDNORDER; i++)	{		p->fdndamps[i] = damper_make(p->fdndamping);	} 	ga = 60.0;	gt = p->revtime;	ga = pow(10.0,-ga/20.0);	n = (int)(p->rate*gt);	p->alpha = pow((double)ga,(double)1.0/(double)n); 	gb = 0.0;	for(i = 0; i < FDNORDER; i++)	{		if (i == 0) gb = 1.000000*p->largestdelay;		if (i == 1) gb = 0.816490*p->largestdelay;		if (i == 2) gb = 0.707100*p->largestdelay;		if (i == 3) gb = 0.632450*p->largestdelay; #if 0		p->fdnlens[i] = nearest_prime((int)gb, 0.5);#else		p->fdnlens[i] = (int)gb;#endif		// p->fdngains[i] = -pow(p->alpha,(double)p->fdnlens[i]);		p->fdngains[i] = -powf((float)p->alpha,p->fdnlens[i]);	} 	p->d = (float *)malloc(FDNORDER*sizeof(float));	p->u = (float *)malloc(FDNORDER*sizeof(float));	p->f = (float *)malloc(FDNORDER*sizeof(float)); 	/* Diffuser section */ 	diffscale = (float)p->fdnlens[3]/(210+159+562+410);	spread1 = spread;	spread2 = 3.0*spread; 	b = 210;	r = 0.125541f;	a = (int)(spread1*r);	c = 210+159+a;	cc = c-b;	r = 0.854046f;	a = (int)(spread2*r);	d = 210+159+562+a;	dd = d-c;	e = 1341-d; 	p->ldifs = (ty_diffuser **)malloc(4*sizeof(ty_diffuser *)); 	p->ldifs[0] = diffuser_make((int)(diffscale*b),0.75);	p->ldifs[1] = diffuser_make((int)(diffscale*cc),0.75);	p->ldifs[2] = diffuser_make((int)(diffscale*dd),0.625);	p->ldifs[3] = diffuser_make((int)(diffscale*e),0.625); 	b = 210;	r = -0.568366f;	a = (int)(spread1*r);	c = 210+159+a;	cc = c-b;	r = -0.126815f;	a = (int)(spread2*r);	d = 210+159+562+a;	dd = d-c;	e = 1341-d; 	p->rdifs = (ty_diffuser **)malloc(4*sizeof(ty_diffuser *)); 	p->rdifs[0] = diffuser_make((int)(diffscale*b),0.75);	p->rdifs[1] = diffuser_make((int)(diffscale*cc),0.75);	p->rdifs[2] = diffuser_make((int)(diffscale*dd),0.625);	p->rdifs[3] = diffuser_make((int)(diffscale*e),0.625); 	/* Tapped delay section */ 	p->tapdelay = fixeddelay_make(44000);	p->taps = (int *)malloc(FDNORDER*sizeof(int));	p->tapgains = (float *)malloc(FDNORDER*sizeof(float)); 	p->taps[0] = (int)(5+0.410*p->largestdelay);	p->taps[1] = (int)(5+0.300*p->largestdelay);	p->taps[2] = (int)(5+0.155*p->largestdelay);	p->taps[3] = (int)(5+0.000*p->largestdelay); 	for(i = 0; i < FDNORDER; i++)	{		p->tapgains[i] = pow(p->alpha,(double)p->taps[i]);	}	    }     // for Chugins extending UGen    void tick( SAMPLE * in, SAMPLE * out, int nframes )    {      float rev[2];      memset(out, 0, sizeof(SAMPLE)*2*nframes);       for (int i=0; i < nframes; i+=2)	{	  gverb_do(p, in[i], rev, rev+1);	  	  out[i] = rev[0] + in[i] * p->drylevel;	  out[i+1] = rev[1] + in[i+1] * p->drylevel;	}	}    // set parameter example  float setRoomsize( t_CKFLOAT x )  {	gverb_set_roomsize(p, x);	return x;  }    // get parameter example  float getRoomsize() { return p->roomsize; }   // set parameter example  float setRevTime( t_CKFLOAT x )  {	gverb_set_revtime(p, x/p->rate);	return x;  }    // get parameter example  float getRevTime() { return (p->revtime*p->rate); }   float setDamping( t_CKFLOAT x )  {	gverb_set_damping(p, x);	return x;  }    // get parameter example  float getDamping() { return p->fdndamping; }   float setBandwidth( t_CKFLOAT x )  {	gverb_set_inputbandwidth(p, x);	return x;  }    // get parameter example  float getBandwidth() { return p->inputbandwidth; }   float setDryLevel( t_CKFLOAT x )  {	gverb_set_drylevel(p, x);	return x;  }    // get parameter example  float getDryLevel() { return p->drylevel; }   float setEarlyLevel( t_CKFLOAT x )  {	gverb_set_earlylevel(p, x);	return x;  }    // get parameter example  float getEarlyLevel() { return p->earlylevel; }   float setTailLevel( t_CKFLOAT x )  {	gverb_set_taillevel(p, x);	return x;  }    // get parameter example  float getTailLevel() { return p->taillevel; } private:  // instance data  ty_gverb realp;  ty_gverb *p;};  // 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( GVerb ){    // hmm, don't change this...    QUERY->setname(QUERY, "GVerb");        // begin the class definition    // can change the second argument to extend a different ChucK class    QUERY->begin_class(QUERY, "GVerb", "UGen");     // register the constructor (probably no need to change)    QUERY->add_ctor(QUERY, gverb_ctor);    // register the destructor (probably no need to change)    QUERY->add_dtor(QUERY, gverb_dtor);     QUERY->doc_class(QUERY, "GVerb is a very smooth reverberator with the "                     "ability to produce very long "                     "reverb times.\n"                      "GVERB is based on the original \"gverb/gigaverb\" by Juhana Sadeharju "                     "(kouhia at nic.funet.fi). The code for this version was adapted from "                     "RTcmix (http:rtcmix.org), which in turn adapted it from the Max/MSP "                     "version by Olaf Mtthes (olaf.matthes at gmx.de).");    QUERY->add_ex(QUERY, "effects/GVerb.ck");        // for UGen's only: add tick function    QUERY->add_ugen_funcf(QUERY, gverb_tick, NULL, 2, 2);        // 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, gverb_setRoomsize, "float", "roomsize");    // example of adding argument to the above method    QUERY->add_arg(QUERY, "float", "arg");    QUERY->doc_func(QUERY, "Set room size [1.0 - 300.0]. Default 30.0.");     // example of adding getter method    QUERY->add_mfun(QUERY, gverb_getRoomsize, "float", "roomsize");    QUERY->doc_func(QUERY, "Get room size [1.0 - 300.0].");     // example of adding setter method    QUERY->add_mfun(QUERY, gverb_setRevTime, "dur", "revtime");    // example of adding argument to the above method    QUERY->add_arg(QUERY, "dur", "arg");    QUERY->doc_func(QUERY, "Set reverberation time. Default 5::second.");     // example of adding getter method    QUERY->add_mfun(QUERY, gverb_getRevTime, "dur", "revtime");    QUERY->doc_func(QUERY, "Get reverberation time.");     // example of adding getter method    QUERY->add_mfun(QUERY, gverb_getDamping, "float", "damping");    QUERY->doc_func(QUERY, "Get high frequency rolloff [0 - 1]. "                    "0 damps the reverb signal completely, 1 not at all. Default 0.");     // example of adding setter method    QUERY->add_mfun(QUERY, gverb_setDamping, "float", "damping");    // example of adding argument to the above method    QUERY->add_arg(QUERY, "float", "arg");    QUERY->doc_func(QUERY, "Set high frequency rolloff [0 - 1]. "                    "0 damps the reverb signal completely, 1 not at all. Default 0.");     // example of adding getter method    QUERY->add_mfun(QUERY, gverb_getBandwidth, "float", "bandwidth");    QUERY->doc_func(QUERY, "Get the input bandwidth [0 - 1]. "                    "Same as damping control, but on the input signal. Default 0.5.");     // example of adding setter method    QUERY->add_mfun(QUERY, gverb_setBandwidth, "float", "bandwidth");    // example of adding argument to the above method    QUERY->add_arg(QUERY, "float", "arg");    QUERY->doc_func(QUERY, "Set the input bandwidth [0 - 1]. "                    "Same as damping control, but on the input signal. Default 0.5.");     // example of adding getter method    QUERY->add_mfun(QUERY, gverb_getDryLevel, "float", "dry");    QUERY->doc_func(QUERY, "Get the amount of dry signal [0 - 1]. Default 0.5.");     // example of adding setter method    QUERY->add_mfun(QUERY, gverb_setDryLevel, "float", "dry");    // example of adding argument to the above method    QUERY->add_arg(QUERY, "float", "arg");    QUERY->doc_func(QUERY, "Set the amount of dry signal [0 - 1]. Default 0.5.");     // example of adding getter method    QUERY->add_mfun(QUERY, gverb_getEarlyLevel, "float", "early");    QUERY->doc_func(QUERY, "Get the early reflection level [0 - 1]. Default 0.4.");     // example of adding setter method    QUERY->add_mfun(QUERY, gverb_setEarlyLevel, "float", "early");    // example of adding argument to the above method    QUERY->add_arg(QUERY, "float", "arg");    QUERY->doc_func(QUERY, "Set the early reflection level [0 - 1]. Default 0.4.");     // example of adding getter method    QUERY->add_mfun(QUERY, gverb_getTailLevel, "float", "tail");    QUERY->doc_func(QUERY, "Get the tail level [0 - 1]. Default 0.5.");     // example of adding setter method    QUERY->add_mfun(QUERY, gverb_setTailLevel, "float", "tail");    // example of adding argument to the above method    QUERY->add_arg(QUERY, "float", "arg");    QUERY->doc_func(QUERY, "Set the tail level [0 - 1]. Default 0.5.");        // this reserves a variable in the ChucK internal class to store     // referene to the c++ class we defined above    gverb_data_offset = QUERY->add_mvar(QUERY, "int", "@gv_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(gverb_ctor){    // get the offset where we'll store our internal c++ class pointer    OBJ_MEMBER_INT(SELF, gverb_data_offset) = 0;        // instantiate our internal c++ class representation    GVerb * bcdata = new GVerb(API->vm->get_srate(API, SHRED));        // store the pointer in the ChucK object member    OBJ_MEMBER_INT(SELF, gverb_data_offset) = (t_CKINT) bcdata;}  // implementation for the destructorCK_DLL_DTOR(gverb_dtor){    // get our c++ class pointer    GVerb * bcdata = (GVerb *) OBJ_MEMBER_INT(SELF, gverb_data_offset);    // check it    if( bcdata )    {        // clean up        delete bcdata;        OBJ_MEMBER_INT(SELF, gverb_data_offset) = 0;        bcdata = NULL;    }}  // implementation for tick functionCK_DLL_TICKF(gverb_tick){    // get our c++ class pointer    GVerb * c = (GVerb *) OBJ_MEMBER_INT(SELF, gverb_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(gverb_setRoomsize){    // get our c++ class pointer    GVerb * bcdata = (GVerb *) OBJ_MEMBER_INT(SELF, gverb_data_offset);    // set the return value    RETURN->v_float = bcdata->setRoomsize(GET_NEXT_FLOAT(ARGS));}  // example implementation for getterCK_DLL_MFUN(gverb_getRoomsize){    // get our c++ class pointer    GVerb * bcdata = (GVerb *) OBJ_MEMBER_INT(SELF, gverb_data_offset);    // set the return value    RETURN->v_float = bcdata->getRoomsize();} // example implementation for setterCK_DLL_MFUN(gverb_setRevTime){    // get our c++ class pointer    GVerb * bcdata = (GVerb *) OBJ_MEMBER_INT(SELF, gverb_data_offset);    // set the return value    RETURN->v_dur = bcdata->setRevTime(GET_NEXT_DUR(ARGS));}  // example implementation for getterCK_DLL_MFUN(gverb_getRevTime){    // get our c++ class pointer    GVerb * bcdata = (GVerb *) OBJ_MEMBER_INT(SELF, gverb_data_offset);    // set the return value    RETURN->v_float = bcdata->getRevTime();} // example implementation for setterCK_DLL_MFUN(gverb_setDamping){    // get our c++ class pointer    GVerb * bcdata = (GVerb *) OBJ_MEMBER_INT(SELF, gverb_data_offset);    // set the return value    RETURN->v_float = bcdata->setDamping(GET_NEXT_FLOAT(ARGS));}  // example implementation for getterCK_DLL_MFUN(gverb_getDamping){

Lines 1–500 of 581.

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