//------------------------------------------------------------------------------------------------------- // VST Plug-Ins SDK // Version 2.4 $Date: 2006/11/13 09:08:27 $ // // Filename : vstxsynth.h // Created by : Alex Medearis, extended from Steinberg Media Technologies // Description : Alex's VST Synth // // A basic FM softsynth. Leveraged from boilerplate code from Steinberg's 2 voice // example. // // Also defines the Note class, used to encapsulate parameters of a single note. // // //------------------------------------------------------------------------------------------------------- #ifndef __vstxsynth__ #define __vstxsynth__ #include "public.sdk/source/vst2.x/audioeffectx.h" #include #define MAX_MOD_INDEX 10000 //------------------------------------------------------------------------------------------ enum { // Global kNumPrograms = 128, kNumOutputs = 2, // Parameters Tags kWaveform1 = 0, kVolume1, kWaveform2, kVolume2, kAttack, kDecay, kModIndex, kVolume, kNumParams }; //------------------------------------------------------------------------------------------ // VstXSynthProgram //------------------------------------------------------------------------------------------ class VstXSynthProgram { friend class VstXSynth; public: VstXSynthProgram (); ~VstXSynthProgram () {} private: float fWaveform1; float fVolume1; float fWaveform2; float fVolume2; float fModIndex; float fAttack; float fDecay; float fVolume; char name[kVstMaxProgNameLen+1]; }; //------------------------------------------------------------------------------------------ // VstXSynth //------------------------------------------------------------------------------------------ class VstXSynth : public AudioEffectX { friend class Note; public: VstXSynth (audioMasterCallback audioMaster); ~VstXSynth (); virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames); virtual VstInt32 processEvents (VstEvents* events); virtual void setProgram (VstInt32 program); virtual void setProgramName (char* name); virtual void getProgramName (char* name); virtual bool getProgramNameIndexed (VstInt32 category, VstInt32 index, char* text); virtual void setParameter (VstInt32 index, float value); virtual float getParameter (VstInt32 index); virtual void getParameterLabel (VstInt32 index, char* label); virtual void getParameterDisplay (VstInt32 index, char* text); virtual void getParameterName (VstInt32 index, char* text); virtual void setSampleRate (float sampleRate); virtual void setBlockSize (VstInt32 blockSize); virtual bool getOutputProperties (VstInt32 index, VstPinProperties* properties); virtual bool getEffectName (char* name); virtual bool getVendorString (char* text); virtual bool getProductString (char* text); virtual VstInt32 getVendorVersion (); virtual VstInt32 canDo (char* text); virtual VstInt32 getNumMidiInputChannels (); virtual VstInt32 getNumMidiOutputChannels (); virtual VstInt32 getMidiProgramName (VstInt32 channel, MidiProgramName* midiProgramName); virtual VstInt32 getCurrentMidiProgram (VstInt32 channel, MidiProgramName* currentProgram); virtual VstInt32 getMidiProgramCategory (VstInt32 channel, MidiProgramCategory* category); virtual bool hasMidiProgramsChanged (VstInt32 channel); virtual bool getMidiKeyName (VstInt32 channel, MidiKeyName* keyName); private: float fWaveform1; float fVolume1; float fWaveform2; float fVolume2; float fModIndex; float fVolume; float fAttack; float fDecay; float fScaler; std::vector * notes; std::vector * notesSwap; VstXSynthProgram* programs; VstInt32 channelPrograms[16]; void updateWaveforms(); void initProcess(); void noteOn (VstInt32 note, VstInt32 velocity, VstInt32 delta); void noteOff (VstInt32 note); void fillProgram (VstInt32 channel, VstInt32 prg, MidiProgramName* mpn); }; class Note { public: Note(VstXSynth * parent, VstInt32 currentNote, VstInt32 currentVelocity, VstInt32 currentDelta); void Play(float** inputs, float** outputs, VstInt32 sampleFrames); void updateEnvelope(float slope); bool Stop(VstInt32 note); VstXSynth * parent; VstInt32 currentNote; VstInt32 currentVelocity; VstInt32 currentDelta; bool noteIsOn; float fPhase1, fPhase2; float envelope; bool isDead; }; #endif