X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/c7f552fd8888da2f0d8cfb228fe0f28d3df3a12c..b4b6f2ea75b9f0f3ca918f5b84016610bf7a4d4f:/interpretor/preprocessor/faust-0.9.47mr3/architecture/csound.cpp diff --git a/interpretor/preprocessor/faust-0.9.47mr3/architecture/csound.cpp b/interpretor/preprocessor/faust-0.9.47mr3/architecture/csound.cpp new file mode 100644 index 0000000..07f9859 --- /dev/null +++ b/interpretor/preprocessor/faust-0.9.47mr3/architecture/csound.cpp @@ -0,0 +1,291 @@ +/************************************************************************ + + IMPORTANT NOTE : this file contains two clearly delimited sections : + the ARCHITECTURE section (in two parts) and the USER section. Each section + is governed by its own copyright and license. Please check individually + each section for license and copyright information. +*************************************************************************/ + +/*******************BEGIN ARCHITECTURE SECTION (part 1/2)****************/ + +/************************************************************************ + FAUST Architecture File + Copyright (C) 2010-2011 V. Lazzarini and GRAME + --------------------------------------------------------------------- + This Architecture section 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 3 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, see . + + EXCEPTION : As a special exception, you may create a larger work + that contains this FAUST architecture section and distribute + that work under terms of your choice, so long as this FAUST + architecture section is not modified. + + + ************************************************************************ + ************************************************************************/ + +//============================================================================== +// +// CSOUND architecture file for FAUST +// Y. Orlarey & V. Lazzarini +// +// Usage : faust -uim -a csound.cpp .dsp -o .cpp +// g++ -O3 -DOPCODE_NAME= -c .cpp -o .o +// ld -E --shared .o -o .so +// +// History : +// - 28/04/09 : first version +// - 29/04/09 : dynamic allocation +// +//============================================================================== + +#include +#include +#include "csdl.h" /* CSOUND plugin API header */ + +// used to transform a symbol in a string +#define sym(name) xsym(name) +#define xsym(name) #name + +// make sure we use csound floats +#define FAUSTFLOAT MYFLT + +// we require macro declarations +#define FAUST_UIMACROS + +// but we will ignore most of them +#define FAUST_ADDBUTTON(l,f) +#define FAUST_ADDCHECKBOX(l,f) +#define FAUST_ADDVERTICALSLIDER(l,f,i,a,b,s) +#define FAUST_ADDHORIZONTALSLIDER(l,f,i,a,b,s) +#define FAUST_ADDNUMENTRY(l,f,i,a,b,s) +#define FAUST_ADDVERTICALBARGRAPH(l,f,a,b) +#define FAUST_ADDHORIZONTALBARGRAPH(l,f,a,b) + +#define max(x,y) (((x)>(y)) ? (x) : (y)) +#define min(x,y) (((x)<(y)) ? (x) : (y)) + +using namespace std; + +// On Intel set FZ (Flush to Zero) and DAZ (Denormals Are Zero) +// flags to avoid costly denormals +#ifdef __SSE__ + #include + #ifdef __SSE2__ + #define AVOIDDENORMALS _mm_setcsr(_mm_getcsr() | 0x8040) + #else + #define AVOIDDENORMALS _mm_setcsr(_mm_getcsr() | 0x8000) + #endif +#else + #define AVOIDDENORMALS +#endif + + + + +/****************************************************************************** +******************************************************************************* + + VECTOR INTRINSICS + +******************************************************************************* +*******************************************************************************/ + + +<> + + + +/** + * We will ignore metadata declarations + */ +struct Meta +{ + void declare (const char* key, const char* value) { } +}; + +/** + * Abstract Definition of a user interface + */ +class UI +{ + public: + + virtual ~UI() {} + + // -- active widgets + + virtual void addButton(const char* label, FAUSTFLOAT* zone) = 0; + virtual void addToggleButton(const char* label, FAUSTFLOAT* zone) = 0; + virtual void addCheckButton(const char* label, FAUSTFLOAT* zone) = 0; + virtual void addVerticalSlider(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step) = 0; + virtual void addHorizontalSlider(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step) = 0; + virtual void addNumEntry(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step) = 0; + + // -- passive widgets + + virtual void addNumDisplay(const char* label, FAUSTFLOAT* zone, int precision) {} + virtual void addTextDisplay(const char* label, FAUSTFLOAT* zone, char* names[], FAUSTFLOAT min, FAUSTFLOAT max) {} + virtual void addHorizontalBargraph(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT min, FAUSTFLOAT max) {} + virtual void addVerticalBargraph(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT min, FAUSTFLOAT max) {} + + // -- widget's layouts + + virtual void openFrameBox(const char* label) {} + virtual void openTabBox(const char* label) {} + virtual void openHorizontalBox(const char* label) {} + virtual void openVerticalBox(const char* label) {} + virtual void closeBox() {} + + virtual void declare(FAUSTFLOAT* zone, const char* key, const char* value) {} +}; + +/** + * A UI that simply collects the active zones in a vector + * and provides a method to copy the csound controls + */ +class CSUI : public UI +{ + vector vZone; + + public: + // -- active widgets + + virtual void addButton(const char* label, FAUSTFLOAT* zone) { vZone.push_back(zone); } + virtual void addToggleButton(const char* label, FAUSTFLOAT* zone) { vZone.push_back(zone); } + virtual void addCheckButton(const char* label, FAUSTFLOAT* zone) { vZone.push_back(zone); } + virtual void addVerticalSlider(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step) { vZone.push_back(zone); } + virtual void addHorizontalSlider(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step) { vZone.push_back(zone); } + virtual void addNumEntry(const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step) { vZone.push_back(zone); } + + void copyfrom(MYFLT* mem[]) { + for (unsigned int i=0; i> + +/***************************END USER SECTION ***************************/ + +/*******************BEGIN ARCHITECTURE SECTION (part 2/2)***************/ + + + +struct dataspace { + OPDS h; /* basic attributes */ + MYFLT* aout[FAUST_OUTPUTS]; /* output buffers */ + MYFLT* ain[FAUST_INPUTS]; /* input buffers */ + MYFLT* ktl[FAUST_ACTIVES]; /* controls */ + dsp* DSP; /* the Faust generated object */ + CSUI* interface; /* do the mapping between CSound controls and DSP fields */ + AUXCH dspmem; /* aux memory allocated once to store the DSP object */ + AUXCH intmem; /* aux memory allocated once to store the interface object */ +}; + + +/** + * Creates a "aaakkkk" CSound description string. Note that + * these string will never be released. Potential memory leak + */ +static char* makeDescription(int numa, int numk=0) +{ + char* str = (char*)malloc(numa+numk+1); // NEED TO BE CHANGED ? + if (str) { + for (int i=0; idspmem.auxp == NULL) + csound->AuxAlloc(csound, sizeof(mydsp), &p->dspmem); + + if(p->intmem.auxp == NULL) + csound->AuxAlloc(csound, sizeof(CSUI), &p->intmem); + + + p->DSP = new (p->dspmem.auxp) mydsp; + p->interface = new (p->intmem.auxp) CSUI; + + if ((p->DSP == 0) | (p->interface == 0)) return NOTOK; + + p->DSP->init((int)csound->GetSr(csound)); + p->DSP->buildUserInterface(p->interface); + + return OK; +} + + +/** + * CSound callback that process the samples by updating + * the controls values and calling the compute() method + * of the DSP object. (Assume MYFLT = FAUSTFLOAT) + */ +static int process32bits(CSOUND *csound, dataspace *p) +{ + AVOIDDENORMALS; + + // update all the control values + p->interface->copyfrom(p->ktl); + + p->DSP->compute(csound->GetKsmps(csound), p->ain, p->aout); + return OK; +} + +extern "C" { + +static OENTRY localops[] = { + {(char*)sym(OPCODE_NAME), sizeof(dataspace),5,makeDescription(FAUST_OUTPUTS), makeDescription(FAUST_INPUTS,FAUST_ACTIVES), + (SUBR)init, NULL,(SUBR)process32bits } +}; +LINKAGE +} + + +/********************END ARCHITECTURE SECTION (part 2/2)****************/ + + +