X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/1059e1cc0c2ecfa237406949aa26155b6a5b9154..66f23d4fabf89ad09adbd4dfc15ac6b5b2b7da83:/interpreter/preprocessor/faust-0.9.47mr3/architecture/vst.cpp diff --git a/interpreter/preprocessor/faust-0.9.47mr3/architecture/vst.cpp b/interpreter/preprocessor/faust-0.9.47mr3/architecture/vst.cpp new file mode 100644 index 0000000..f1b73e9 --- /dev/null +++ b/interpreter/preprocessor/faust-0.9.47mr3/architecture/vst.cpp @@ -0,0 +1,667 @@ +/************************************************************************ + + 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) 2004-2011 Remy Muller + All rights reserved. + ----------------------------BSD License------------------------------ + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Remy Muller nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + OF THE POSSIBILITY OF SUCH DAMAGE. + + ----------------------------VST SDK---------------------------------- + In order to compile a VST (TM) plugin with this architecture file + you will need the proprietary VST SDK from Steinberg. Please check + the corresponding license. + + ************************************************************************ + ************************************************************************/ + + +/******************************************************************** + * VST wrapper for the FAUST language. + * Author: remy muller remy.muller@ircam.fr + * http://www.smartelectronix.com/~mdsp/ + * + * FAUST + * Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale + * http://www.grame.fr/ + * + ********************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include + +using namespace std ; + +// There is a bug with powf() when cross compiling with mingw +// the following macro avoid the problem +#ifdef WIN32 +#define powf(x,y) pow(x,y) +#define expf(x) exp(x) +#endif + +// 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 + +struct Meta +{ + void declare (const char* key, const char* value) { } +}; + + +#ifdef __GNUC__ + +//------------------------------------------------------------------- +// Generic min and max using gcc extensions +//------------------------------------------------------------------- + +#define max(x,y) ((x)>?(y)) +#define min(x,y) ((x)b) ? a : b; } +inline int max (int a, int b) { return (a>b) ? a : b; } + +inline long max (long a, long b) { return (a>b) ? a : b; } +inline long max (int a, long b) { return (a>b) ? a : b; } +inline long max (long a, int b) { return (a>b) ? a : b; } + +inline float max (float a, float b) { return (a>b) ? a : b; } +inline float max (int a, float b) { return (a>b) ? a : b; } +inline float max (float a, int b) { return (a>b) ? a : b; } +inline float max (long a, float b) { return (a>b) ? a : b; } +inline float max (float a, long b) { return (a>b) ? a : b; } + +inline double max (double a, double b) { return (a>b) ? a : b; } +inline double max (int a, double b) { return (a>b) ? a : b; } +inline double max (double a, int b) { return (a>b) ? a : b; } +inline double max (long a, double b) { return (a>b) ? a : b; } +inline double max (double a, long b) { return (a>b) ? a : b; } +inline double max (float a, double b) { return (a>b) ? a : b; } +inline double max (double a, float b) { return (a>b) ? a : b; } + + +inline int min (int a, int b) { return (a T abs (T a) { return (a> n); } + +inline int int2pow2 (int x) { int r=0; while ((1<> + +/****************************************************************************** +******************************************************************************* +* +* USER INTERFACE +* +******************************************************************************* +*******************************************************************************/ + +class UI +{ + bool fStopped; + +public: + + UI() : fStopped(false) {} + virtual ~UI() {} + + virtual void addButton(char* label, float* zone) = 0; + virtual void addToggleButton(char* label, float* zone) = 0; + virtual void addCheckButton(char* label, float* zone) = 0; + virtual void addVerticalSlider(char* label, float* zone, float init, float min, float max, float step) = 0; + virtual void addHorizontalSlider(char* label, float* zone, float init, float min, float max, float step) = 0; + virtual void addNumEntry(char* label, float* zone, float init, float min, float max, float step) = 0; + + virtual void addNumDisplay(char* label, float* zone, int precision) = 0; + virtual void addTextDisplay(char* label, float* zone, char* names[], float min, float max) = 0; + virtual void addHorizontalBargraph(char* label, float* zone, float min, float max) = 0; + virtual void addVerticalBargraph(char* label, float* zone, float min, float max) = 0; + + virtual void openFrameBox(char* label) = 0; + virtual void openTabBox(char* label) = 0; + virtual void openHorizontalBox(char* label) = 0; + virtual void openVerticalBox(char* label) = 0; + virtual void closeBox() = 0; + + virtual void run() {}; + + void stop() { fStopped = true; } + bool stopped() { return fStopped; } + + virtual void declare(float* zone, const char* key, const char* value) {} +}; + + +/****************************************************************************** +******************************************************************************* +* +* FAUST DSP +* +******************************************************************************* +*******************************************************************************/ + + + +//---------------------------------------------------------------- +// definition du processeur de signal +//---------------------------------------------------------------- + +class dsp { + +protected: + + int fSamplingFreq; + +public: + + dsp() {} + virtual ~dsp() {} + virtual int getNumInputs() = 0; + virtual int getNumOutputs() = 0; + virtual void buildUserInterface(UI* interface) = 0; + virtual void init(int samplingRate) = 0; + virtual void compute(int len, float** inputs, float** outputs) = 0; +}; + +/********************END ARCHITECTURE SECTION (part 1/2)****************/ + +/**************************BEGIN USER SECTION **************************/ + +<> + +/***************************END USER SECTION ***************************/ + +/*******************BEGIN ARCHITECTURE SECTION (part 2/2)***************/ + +/****************************************************************************** + * + * VST wrapper + * + ******************************************************************************/ + +#include "audioeffectx.h" + +class vstUI; + +class Faust : public AudioEffectX +{ +public: + Faust(audioMasterCallback audioMaster); + virtual ~Faust(); + + virtual void process(float **inputs, float **outputs, long sampleFrames); + virtual void processReplacing(float **inputs, float **outputs, long sampleFrames); + + virtual void setProgramName(char *name); + virtual void setProgram(long index); + virtual void getProgramName(char *name); + + virtual void setParameter(long index, float value); + virtual float getParameter(long index); + virtual void getParameterLabel(long index, char *label); + virtual void getParameterDisplay(long index, char *text); + virtual void getParameterName(long index, char *text); + + virtual void setSampleRate(float sampleRate); + + virtual bool getEffectName (char* name); + virtual bool getVendorString (char* text); + virtual bool getProductString (char* text); + + virtual bool getInputProperties (long index, VstPinProperties* properties); + virtual bool getOutputProperties (long index, VstPinProperties* properties); + +private: + mydsp* dsp; + vstUI* dspUI; +}; + +/*--------------------------------------------------------------------------*/ +class vstUIObject { +protected: + string fLabel; + float* fZone; + + float range(float min, float max, float val) + { // VST parameters are normalized in the range [0;1] + val = min + val * (max - min); + return (val < min) ? min : (val > max) ? max : val; + } + +public: + vstUIObject(char* label, float* zone):fLabel(label),fZone(zone) {} + virtual ~vstUIObject() {} + + virtual void GetName(char *text){std::strcpy(text,fLabel.c_str());} + virtual void SetValue(double f) {*fZone = range(0.0f,1.0f,(float)f);} + virtual float GetValue() {return *fZone;} + virtual void GetDisplay(char *text){std::sprintf(text,"%f",*fZone);} + virtual long GetID() + { /* returns the sum of all the ASCII characters contained in the parameter's label */ + int i; + long acc; + for(i=0,acc = 0;i0.5f)?1.0f:0.0f;} + virtual void GetDisplay(char *text){(*fZone>0.5f)? std::strcpy(text,"ON"): std::strcpy(text,"OFF");} +}; + +/*--------------------------------------------------------------------------*/ +class vstCheckButton : public vstUIObject { + +public: + + vstCheckButton(char* label, float* zone):vstUIObject(label,zone) {} + virtual ~vstCheckButton() {} + virtual float GetValue() {return *fZone;} + virtual void SetValue(double f) {*fZone = (f>0.5f)?1.0f:0.0f;} + virtual void GetDisplay(char *text){(*fZone>0.5f)? std::strcpy(text,"ON"): std::strcpy(text,"OFF");} +}; + +/*--------------------------------------------------------------------------*/ +class vstButton : public vstUIObject { + +public: + + vstButton(char* label, float* zone):vstUIObject(label,zone) {} + virtual ~vstButton() {} + virtual float GetValue() {return *fZone;} + virtual void SetValue(double f) {*fZone = (f>0.5f)?1.0f:0.0f;} + virtual void GetDisplay(char *text){(*fZone>0.5f)? std::strcpy(text,"ON"): std::strcpy(text,"OFF");} +}; + +/*--------------------------------------------------------------------------*/ +class vstSlider : public vstUIObject{ + +private: + + float fInit; + float fMin; + float fMax; + float fStep; + +public: + + vstSlider(char* label, float* zone, float init, float min, float max, float step) + :vstUIObject(label,zone), fInit(init), fMin(min), fMax(max),fStep(step) {} + virtual ~vstSlider() {} + + virtual float GetValue() {return (*fZone-fMin)/(fMax-fMin);} // normalize + virtual void SetValue(double f) {*fZone = range(fMin,fMax,(float)f);} // expand +}; + +/*--------------------------------------------------------------------------*/ +class vstUI : public UI +{ +private: + + vector fUITable; + +public: + + vstUI(){} + virtual ~vstUI() + { + for (vector::iterator iter = fUITable.begin(); iter != fUITable.end(); iter++) delete *iter; + } + + void addButton(char* label, float* zone) {fUITable.push_back(new vstButton(label, zone));} + + void addToggleButton(char* label, float* zone) {fUITable.push_back(new vstToggleButton(label, zone));} + + void addCheckButton(char* label, float* zone) {fUITable.push_back(new vstCheckButton(label, zone));} + + void addVerticalSlider(char* label, float* zone, float init, float min, float max, float step) + { + fUITable.push_back(new vstSlider(label, zone, init, min, max, step)); + } + + void addHorizontalSlider(char* label, float* zone, float init, float min, float max, float step) + { + fUITable.push_back(new vstSlider(label, zone, init, min, max, step)); + } + + void addNumEntry(char* label, float* zone, float init, float min, float max, float step) {} + + void openFrameBox(char* label) {} + void openTabBox(char* label) {} + void openHorizontalBox(char* label) {} + void openVerticalBox(char* label) {} + void closeBox() {} + + void SetValue(int index, double f) {assert(indexSetValue(f);} + float GetValue(long index) {assert(indexGetValue();} + void GetDisplay(long index, char *text) {assert(indexGetDisplay(text);} + void GetName(long index, char *text) {assert(indexGetName(text);} + long GetNumParams() {return fUITable.size();} + + long makeID() + /* Creates a (unique?)id by summing all the parameter's labels, + * then wrapping it in the range [0;maxNumberOfId] and adding + * this number to the offset made by the Four Character ID: 'FAUS' + */ + { + const long maxNumberOfId = 128; + long baseid = 'FAUS'; + long id=0; + for(int i=0;iGetID(); + return baseid + id % maxNumberOfId; + } + + // To be implemented + void addNumDisplay(char* label, float* zone, int precision){} + void addTextDisplay(char* label, float* zone, char* names[], float min, float max){} + void addHorizontalBargraph(char* label, float* zone, float min, float max){} + void addVerticalBargraph(char* label, float* zone, float min, float max){} +}; + +//----------------------------------------------------------------------------- +#define NUM_PROGRAMS 0 +#define FAKE_NUM_PARAMS 16 + +Faust::Faust(audioMasterCallback audioMaster) + :AudioEffectX(audioMaster, NUM_PROGRAMS,FAKE_NUM_PARAMS) +{ + dsp = new mydsp(); + dspUI= new vstUI(); + dsp->buildUserInterface(dspUI); + dsp->init(long(getSampleRate())); + + /* we override here the fake number of parameters with the real one*/ + this->cEffect.numParams = this->numParams = dspUI->GetNumParams(); + + setNumInputs(dsp->getNumInputs()); + setNumOutputs(dsp->getNumOutputs()); + setUniqueID(dspUI->makeID()); + canProcessReplacing();//? +} + +//---------------------------------------------------------------------------- +Faust::~Faust() +{ + if (dsp) delete dsp; + if (dspUI) delete dspUI; +} + +//----------------------------------------------------------------------------- +void Faust::setParameter(long index, float value) +{ + if(indexSetValue(index,value); +} +//----------------------------------------------------------------------------- +float Faust::getParameter(long index) +{ + if(indexGetValue(index); + else + return 0.0f; +} +//----------------------------------------------------------------------------- +void Faust::getParameterName(long index, char *label) +{ + if(indexGetName(index,label); + else + strcpy(label,""); +} +//----------------------------------------------------------------------------- +void Faust::getParameterDisplay(long index, char *text) +{ + if(indexGetDisplay(index,text); + else + strcpy(text,""); +} +//----------------------------------------------------------------------------- +void Faust::getParameterLabel(long index, char *label) +{ + strcpy(label,""); +} + +//----------------------------------------------------------------------------- +void Faust::setProgramName(char *name) +{ + // this template does not use programs yet +} +//----------------------------------------------------------------------------- +void Faust::setProgram(long index) +{ + // this template does not use programs yet +}; +//----------------------------------------------------------------------------- +void Faust::getProgramName(char *name) +{ + // this template does not use programs yet + strcpy(name, ""); +} +//----------------------------------------------------------------------------- +void Faust::process(float **inputs, float **outputs, long sampleFrames) +{ + AVOIDDENORMALS; + dsp->compute(sampleFrames, inputs, outputs); +} +//----------------------------------------------------------------------------- +void Faust::processReplacing(float **inputs, float **outputs, long sampleFrames) +{ + AVOIDDENORMALS; + dsp->compute(sampleFrames, inputs, outputs); +} +//----------------------------------------------------------------------------- +void Faust::setSampleRate(float sampleRate) +{ + // allways call this + AudioEffect::setSampleRate(sampleRate); + dsp->init(long(getSampleRate())); +} +//----------------------------------------------------------------------------------------- +bool Faust::getEffectName (char* name) +{ + return false; +} +//----------------------------------------------------------------------------------------- +bool Faust::getVendorString (char* text) +{ + strcpy (text, "Grame"); + return true; +} +//----------------------------------------------------------------------------------------- +bool Faust::getProductString (char* text) +{ + strcpy (text, "Faust DSP"); + return true; +} +//----------------------------------------------------------------------------------------- +bool Faust::getInputProperties (long index, VstPinProperties* properties) +{ + if(index>=0 && indexgetNumOutputs()) + { + sprintf (properties->label , "Grame Faust DSP: %d",index); + sprintf (properties->shortLabel, "Faust: %d",index); + properties->flags = kVstPinIsActive; + return true; + } + else + return false; +} +//----------------------------------------------------------------------------------------- +bool Faust::getOutputProperties (long index, VstPinProperties* properties) +{ + if(index>=0 && indexgetNumInputs()) + { + sprintf (properties->label , "Grame Faust DSP: %d",index); + sprintf (properties->shortLabel, "Faust: %d",index); + properties->flags = kVstPinIsActive; + return true; + } + else + return false; +} + +/***************************************************************************** + * + * DLL Entry Point + * + ******************************************************************************/ +bool oome = false; + +#if MAC +#pragma export on +#endif + +// prototype of the export function main +#if BEOS +#define main main_plugin +extern "C" __declspec(dllexport) AEffect *main_plugin (audioMasterCallback audioMaster); + +#elif MACX +#define main main_macho +extern "C" AEffect *main_macho (audioMasterCallback audioMaster); + +#else +AEffect *main (audioMasterCallback audioMaster); +#endif + +AEffect *main (audioMasterCallback audioMaster) +{ + // get vst version + if (!audioMaster (0, audioMasterVersion, 0, 0, 0, 0)) + return 0; // old version + + AudioEffect* effect = new Faust(audioMaster); + if (!effect) + return 0; + if (oome) + { + delete effect; + return 0; + } + return effect->getAeffect (); +} + +#if MAC +#pragma export off +#endif + +#if WIN32 +#include +void* hInstance; +BOOL WINAPI DllMain (HINSTANCE hInst, DWORD dwReason, LPVOID lpvReserved) +{ + hInstance = hInst; + return 1; +} +#endif + +/********************END ARCHITECTURE SECTION (part 2/2)****************/ + +