/* ZynAddSubFX - a software synthesizer Master.h - It sends Midi Messages to Parts, receives samples from parts, process them with system/insertion effects and mix them Copyright (C) 2002-2005 Nasca Octavian Paul Author: Nasca Octavian Paul This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License (version 2) along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef MASTER_H #define MASTER_H #include "../globals.h" #include "Microtonal.h" #include "Bank.h" #include "Recorder.h" #include "Dump.h" #include "XMLwrapper.h" #include "../Params/Controller.h" typedef enum { MUTEX_TRYLOCK, MUTEX_LOCK, MUTEX_UNLOCK } lockset; extern Dump dump; struct vuData { vuData(void); float outpeakl, outpeakr, maxoutpeakl, maxoutpeakr, rmspeakl, rmspeakr; int clipped; }; /** It sends Midi Messages to Parts, receives samples from parts, * process them with system/insertion effects and mix them */ class Master { public: /** Constructor TODO make private*/ Master(); /** Destructor*/ ~Master(); static Master &getInstance(); static void deleteInstance(); /**Saves all settings to a XML file * @return 0 for ok or <0 if there is an error*/ int saveXML(const char *filename); /**This adds the parameters to the XML data*/ void add2XML(XMLwrapper *xml); void defaults(); /**loads all settings from a XML file * @return 0 for ok or -1 if there is an error*/ int loadXML(const char *filename); void applyparameters(bool lockmutex = true); void getfromXML(XMLwrapper *xml); /**get all data to a newly allocated array (used for VST) * @return the datasize*/ int getalldata(char **data); /**put all data from the *data array to zynaddsubfx parameters (used for VST)*/ void putalldata(char *data, int size); //Mutex control /**Control the Master's mutex state. * @param lockset either trylock, lock, or unlock. * @return true when successful false otherwise.*/ bool mutexLock(lockset request); //Midi IN void noteOn(char chan, char note, char velocity); void noteOff(char chan, char note); void polyphonicAftertouch(char chan, char note, char velocity); void setController(char chan, int type, int par); void setProgram(char chan, unsigned int pgm); //void NRPN... void ShutUp(); int shutup; void vuUpdate(const float *outl, const float *outr); /**Audio Output*/ void AudioOut(float *outl, float *outr); /**Audio Output (for callback mode). This allows the program to be controled by an external program*/ void GetAudioOutSamples(size_t nsamples, unsigned samplerate, float *outl, float *outr); void partonoff(int npart, int what); /**parts \todo see if this can be made to be dynamic*/ class Part * part[NUM_MIDI_PARTS]; //parameters unsigned char Pvolume; unsigned char Pkeyshift; unsigned char Psysefxvol[NUM_SYS_EFX][NUM_MIDI_PARTS]; unsigned char Psysefxsend[NUM_SYS_EFX][NUM_SYS_EFX]; //parameters control void setPvolume(char Pvolume_); void setPkeyshift(char Pkeyshift_); void setPsysefxvol(int Ppart, int Pefx, char Pvol); void setPsysefxsend(int Pefxfrom, int Pefxto, char Pvol); //effects class EffectMgr * sysefx[NUM_SYS_EFX]; //system class EffectMgr * insefx[NUM_INS_EFX]; //insertion // void swapcopyeffects(int what,int type,int neff1,int neff2); //HDD recorder Recorder HDDRecorder; //part that's apply the insertion effect; -1 to disable short int Pinsparts[NUM_INS_EFX]; //peaks for VU-meter void vuresetpeaks(); //get VU-meter data vuData getVuData(); //peaks for part VU-meters /**\todo synchronize this with a mutex*/ float vuoutpeakpart[NUM_MIDI_PARTS]; unsigned char fakepeakpart[NUM_MIDI_PARTS]; //this is used to compute the "peak" when the part is disabled Controller ctl; bool swaplr; //if L and R are swapped //other objects Microtonal microtonal; Bank bank; class FFTwrapper * fft; pthread_mutex_t mutex; pthread_mutex_t vumutex; private: bool nullRun; vuData vu; float volume; float sysefxvol[NUM_SYS_EFX][NUM_MIDI_PARTS]; float sysefxsend[NUM_SYS_EFX][NUM_SYS_EFX]; int keyshift; //information relevent to generating plugin audio samples float *bufl; float *bufr; off_t off; size_t smps; }; #endif