diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2011-09-20 16:08:52 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2011-09-20 16:08:52 +0200 |
commit | 5591f1602e6171492f5e4620e67d3addeacad7aa (patch) | |
tree | a51c16d5760cd7db9b1fbbf5bf3afeb9bae4ab18 | |
parent | 6611e83df0ed5b9bed42ff8cd549da0b5df11df2 (diff) |
VSTi plugin version.
-rw-r--r-- | src/mutex.cc | 48 | ||||
-rw-r--r-- | src/mutex.h | 4 | ||||
-rw-r--r-- | src/path.cc | 14 | ||||
-rw-r--r-- | vst/Makefile | 43 | ||||
-rw-r--r-- | vst/README | 11 | ||||
-rw-r--r-- | vst/constants.h | 32 | ||||
-rw-r--r-- | vst/drumgizmo_vst.cc | 349 | ||||
-rw-r--r-- | vst/drumgizmo_vst.h | 94 | ||||
-rw-r--r-- | vst/input_vst.cc | 112 | ||||
-rw-r--r-- | vst/input_vst.h | 60 | ||||
-rw-r--r-- | vst/output_vst.cc | 86 | ||||
-rw-r--r-- | vst/output_vst.h | 54 |
12 files changed, 895 insertions, 12 deletions
diff --git a/src/mutex.cc b/src/mutex.cc index ec0d0e8..22d59a6 100644 --- a/src/mutex.cc +++ b/src/mutex.cc @@ -27,32 +27,62 @@ */ #include "mutex.h" +#ifdef WIN32 +#include <windows.h> +#else +#include <pthread.h> +#endif + +struct mutex_private_t { +#ifdef WIN32 + HANDLE mutex; +#else + pthread_mutex_t mutex; +#endif +}; + Mutex::Mutex() { - pthread_mutex_init (&mutex, NULL); + prv = new struct mutex_private_t(); +#ifdef WIN32 + prv->mutex = CreateMutex(NULL, // default security attributes + FALSE, // initially not owned + NULL); // unnamed mutex +#else + pthread_mutex_init (&prv->mutex, NULL); +#endif } Mutex::~Mutex() { - pthread_mutex_destroy(&mutex); -} +#ifdef WIN32 + CloseHandle(prv->mutex); +#else + pthread_mutex_destroy(&prv->mutex); +#endif -bool Mutex::trylock() -{ - return pthread_mutex_trylock(&mutex) == 0; + if(prv) delete prv; } void Mutex::lock() { - pthread_mutex_lock(&mutex); +#ifdef WIN32 + WaitForSingleObject(prv->mutex, // handle to mutex + INFINITE); // no time-out interval +#else + pthread_mutex_lock(&prv->mutex); +#endif } void Mutex::unlock() { - pthread_mutex_unlock(&mutex); +#ifdef WIN32 + ReleaseMutex(prv->mutex); +#else + pthread_mutex_unlock(&prv->mutex); +#endif } - MutexAutolock::MutexAutolock(Mutex &m) : mutex(m) { diff --git a/src/mutex.h b/src/mutex.h index cf052ad..11704d4 100644 --- a/src/mutex.h +++ b/src/mutex.h @@ -28,7 +28,7 @@ #ifndef __PRACRO_MUTEX_H__ #define __PRACRO_MUTEX_H__ -#include <pthread.h> +struct mutex_private_t; class Mutex { public: @@ -40,7 +40,7 @@ public: void unlock(); private: - pthread_mutex_t mutex; + struct mutex_private_t* prv; }; class MutexAutolock { diff --git a/src/path.cc b/src/path.cc index 3812b87..8be2f26 100644 --- a/src/path.cc +++ b/src/path.cc @@ -26,15 +26,27 @@ */ #include "path.h" +#ifndef WIN32 #include <libgen.h> +#endif + #include <string.h> #include <stdlib.h> std::string getPath(std::string file) { + std::string p; +#ifndef WIN32 char *b = strdup(file.c_str()); - std::string p = dirname(b); + p = dirname(b); free(b); +#else + char drive[_MAX_DRIVE]; + char dir[_MAX_DIR]; + _splitpath(file.c_str(), drive, dir, NULL, NULL); + p = std::string(drive) + dir; +#endif + return p; } diff --git a/vst/Makefile b/vst/Makefile new file mode 100644 index 0000000..5400acd --- /dev/null +++ b/vst/Makefile @@ -0,0 +1,43 @@ +VST_BASE = vstsdk2.4 +VST_SRC_BASE = ${VST_BASE}/public.sdk/source/vst2.x/ +VST_SRC = \ + ${VST_SRC_BASE}/audioeffectx.cpp \ + ${VST_SRC_BASE}/audioeffect.cpp \ + ${VST_SRC_BASE}/vstplugmain.cpp + +DG_BASE = ../ +DG_SRC = \ + ${DG_BASE}/src/audiofile.cc \ + ${DG_BASE}/src/channel.cc \ + ${DG_BASE}/src/channelmixer.cc \ + ${DG_BASE}/src/drumgizmo.cc \ + ${DG_BASE}/src/drumkit.cc \ + ${DG_BASE}/src/drumkitparser.cc \ + ${DG_BASE}/src/events.cc \ + ${DG_BASE}/src/instrument.cc \ + ${DG_BASE}/src/instrumentparser.cc \ + ${DG_BASE}/src/midimapparser.cc \ + ${DG_BASE}/src/midimapper.cc \ + ${DG_BASE}/src/mutex.cc \ + ${DG_BASE}/src/path.cc \ + ${DG_BASE}/src/sample.cc \ + ${DG_BASE}/src/saxparser.cc \ + ${DG_BASE}/src/velocity.cc +DG_FLAGS = -I../include -I../src + +EXPAT_BASE = expat +EXPAT_FLAGS = -I${EXPAT_BASE}/Source/lib -L${EXPAT_BASE}/Bin -lexpat + +SNDFILE_BASE = libsndfile +SNDFILE_FLAGS = -I${SNDFILE_BASE}\include -L${SNDFILE_BASE}/bin -lsndfile-1 + +SRC = \ + drumgizmo_vst.cc \ + input_vst.cc \ + output_vst.cc + +all: + g++ -g -Wall -DWIN32 ${DG_FLAGS} ${EXPAT_FLAGS} ${SNDFILE_FLAGS} -I${VST_BASE} ${DG_SRC} ${VST_SRC} ${SRC} -shared -o drumgizmo_vst.dll -Wl,--out-implib,libdrumgizmo_vst.a + +clean: + rm -f drumgizmo_vst.dll libdrumgizmo_vst.a
\ No newline at end of file diff --git a/vst/README b/vst/README new file mode 100644 index 0000000..0d08c94 --- /dev/null +++ b/vst/README @@ -0,0 +1,11 @@ +Get http://expat.sourceforge.net/ and http://www.mega-nerd.com/libsndfile/ + in their win32 binary versions. +Unpack them in the vst/ subfolders: expat and libsndfile. + +Get vstsdk2.4 and unpack it in the vstsdk2.4 subfolder. + +Use mingw and compile with 'make'. + +Copy libexpat.dll and libsndfile-1.dll to the system32 folder. + +Run the DAW with drumgizmo_vst.dll.
\ No newline at end of file diff --git a/vst/constants.h b/vst/constants.h new file mode 100644 index 0000000..ff07c54 --- /dev/null +++ b/vst/constants.h @@ -0,0 +1,32 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * constants.h + * + * Tue Sep 20 11:49:29 CEST 2011 + * Copyright 2011 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo 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 2 of the License, or + * (at your option) any later version. + * + * DrumGizmo 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 DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef __DRUMGIZMO_CONSTANTS_H__ +#define __DRUMGIZMO_CONSTANTS_H__ + +#define NUM_OUTPUTS 16 + +#endif/*__DRUMGIZMO_CONSTANTS_H__*/ diff --git a/vst/drumgizmo_vst.cc b/vst/drumgizmo_vst.cc new file mode 100644 index 0000000..8e29f2d --- /dev/null +++ b/vst/drumgizmo_vst.cc @@ -0,0 +1,349 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * drumgizmo_vst.cc + * + * Tue Sep 20 08:22:48 CEST 2011 + * Copyright 2011 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo 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 2 of the License, or + * (at your option) any later version. + * + * DrumGizmo 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 DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "drumgizmo_vst.h" + +#include "constants.h" + +#define NUM_PROGRAMS 0 +#define NUM_PARAMS 0 + +AudioEffect* createEffectInstance(audioMasterCallback audioMaster) +{ + return new DrumGizmoVst(audioMaster); +} + +DrumGizmoVst::DrumGizmoVst(audioMasterCallback audioMaster) + : AudioEffectX(audioMaster, NUM_PROGRAMS, NUM_PARAMS) +{ + pos = 0; + buffer = NULL; + buffer_size = 0; + + output = new OutputVST(); + input = new InputVST(); + drumgizmo = new DrumGizmo(output, input); + + // initialize programs + //programs = new DrumGizmoVstProgram[kNumPrograms]; + //for(VstInt32 i = 0; i < 16; i++) channelPrograms[i] = i; + + //if(programs) setProgram(0); + + if(audioMaster) { + setNumInputs(0); // no audio inputs + setNumOutputs(NUM_OUTPUTS); + canProcessReplacing(); + isSynth(); + char id[] = "DGv1"; // Four bytes typecasted into an unsigned integer + setUniqueID((unsigned int)*id); + } + + initProcess(); + suspend(); +} + +DrumGizmoVst::~DrumGizmoVst() +{ + delete drumgizmo; + delete input; + delete output; +} + +void DrumGizmoVst::setProgram(VstInt32 program) {} +void DrumGizmoVst::setProgramName(char* name) {} +void DrumGizmoVst::getProgramName(char* name) { name[0] = '\0'; } + +void DrumGizmoVst::getParameterLabel(VstInt32 index, char* label) +{ + label[0] = '\0'; + /* + switch(index) + { + case kWaveform1: + case kWaveform2: + vst_strncpy(label, "Shape", kVstMaxParamStrLen); + break; + + case kFreq1: + case kFreq2: + vst_strncpy(label, "Hz", kVstMaxParamStrLen); + break; + + case kVolume1: + case kVolume2: + case kVolume: + vst_strncpy(label, "dB", kVstMaxParamStrLen); + break; + } + */ +} + +void DrumGizmoVst::getParameterDisplay(VstInt32 index, char* text) +{ + text[0] = 0; + /* + switch(index) + { + case kWaveform1: + if(fWaveform1 < .5) + vst_strncpy(text, "Sawtooth", kVstMaxParamStrLen); + else + vst_strncpy(text, "Pulse", kVstMaxParamStrLen); + break; + + case kFreq1: float2string(fFreq1, text, kVstMaxParamStrLen); break; + case kVolume1: dB2string(fVolume1, text, kVstMaxParamStrLen); break; + + case kWaveform2: + if(fWaveform2 < .5) + vst_strncpy(text, "Sawtooth", kVstMaxParamStrLen); + else + vst_strncpy(text, "Pulse", kVstMaxParamStrLen); + break; + + case kFreq2: float2string(fFreq2, text, kVstMaxParamStrLen); break; + case kVolume2: dB2string(fVolume2, text, kVstMaxParamStrLen); break; + case kVolume: dB2string(fVolume, text, kVstMaxParamStrLen); break; + } + */ +} + +void DrumGizmoVst::getParameterName(VstInt32 index, char* label) +{ + /* + switch(index) + { + case kWaveform1: vst_strncpy(label, "Wave 1", kVstMaxParamStrLen); break; + case kFreq1: vst_strncpy(label, "Freq 1", kVstMaxParamStrLen); break; + case kVolume1: vst_strncpy(label, "Levl 1", kVstMaxParamStrLen); break; + case kWaveform2: vst_strncpy(label, "Wave 2", kVstMaxParamStrLen); break; + case kFreq2: vst_strncpy(label, "Freq 2", kVstMaxParamStrLen); break; + case kVolume2: vst_strncpy(label, "Levl 2", kVstMaxParamStrLen); break; + case kVolume: vst_strncpy(label, "Volume", kVstMaxParamStrLen); break; + } + */ +} + +void DrumGizmoVst::setParameter(VstInt32 index, float value) +{ + /* + DrumGizmoVstProgram *ap = &programs[curProgram]; + switch(index) + { + case kWaveform1: fWaveform1 = ap->fWaveform1 = value; break; + case kFreq1: fFreq1 = ap->fFreq1 = value; break; + case kVolume1: fVolume1 = ap->fVolume1 = value; break; + case kWaveform2: fWaveform2 = ap->fWaveform2 = value; break; + case kFreq2: fFreq2 = ap->fFreq2 = value; break; + case kVolume2: fVolume2 = ap->fVolume2 = value; break; + case kVolume: fVolume = ap->fVolume = value; break; + } + */ +} + +float DrumGizmoVst::getParameter(VstInt32 index) +{ + float value = 0; + /* + switch(index) + { + case kWaveform1: value = fWaveform1; break; + case kFreq1: value = fFreq1; break; + case kVolume1: value = fVolume1; break; + case kWaveform2: value = fWaveform2; break; + case kFreq2: value = fFreq2; break; + case kVolume2: value = fVolume2; break; + case kVolume: value = fVolume; break; + } + */ + return value; +} + +bool DrumGizmoVst::getOutputProperties(VstInt32 index, + VstPinProperties* properties) +{ + if(index < NUM_OUTPUTS) + { + vst_strncpy(properties->label, "Channel ", 63); + char temp[11] = {0}; + int2string(index + 1, temp, 10); + vst_strncat(properties->label, temp, 63); + + properties->flags = kVstPinIsActive; + + return true; + } + return false; +} + +bool DrumGizmoVst::getProgramNameIndexed(VstInt32 category, VstInt32 index, + char* text) +{ + return false; +} + +bool DrumGizmoVst::getEffectName(char* name) +{ + vst_strncpy(name, "DrumGizmo", kVstMaxEffectNameLen); + return true; +} + +bool DrumGizmoVst::getVendorString(char* text) +{ + vst_strncpy(text, "Aasimon.org", kVstMaxVendorStrLen); + return true; +} + +bool DrumGizmoVst::getProductString(char* text) +{ + vst_strncpy(text, "Vst Synth", kVstMaxProductStrLen); + return true; +} + +VstInt32 DrumGizmoVst::getVendorVersion() +{ + return 1000; +} + +VstInt32 DrumGizmoVst::canDo(char* text) +{ + if(!strcmp(text, "receiveVstEvents")) return 1; + if(!strcmp(text, "receiveVstMidiEvent")) return 1; + if(!strcmp(text, "midiProgramNames")) return 1; + return -1; // explicitly can't do; 0 => don't know +} + +VstInt32 DrumGizmoVst::getNumMidiInputChannels() +{ + return 1; // we are monophonic +} + +VstInt32 DrumGizmoVst::getNumMidiOutputChannels() +{ + return 0; // no MIDI output back to Host app +} + +VstInt32 DrumGizmoVst::getMidiProgramName(VstInt32 channel, + MidiProgramName* mpn) +{ + VstInt32 prg = mpn->thisProgramIndex; + if(prg < 0 || prg >= 128) + return 0; + fillProgram(channel, prg, mpn); + if(channel == 9) + return 1; + return 128L; +} + +VstInt32 DrumGizmoVst::getCurrentMidiProgram(VstInt32 channel, + MidiProgramName* mpn) +{ + if(channel < 0 || channel >= 16 || !mpn) return -1; + VstInt32 prg = 0; + mpn->thisProgramIndex = prg; + fillProgram(channel, prg, mpn); + return prg; +} + +void DrumGizmoVst::fillProgram(VstInt32 channel, VstInt32 prg, + MidiProgramName* mpn) +{ + mpn->midiBankMsb = mpn->midiBankLsb = -1; + mpn->reserved = 0; + mpn->flags = 0; + + vst_strncpy(mpn->name, "Standard", 63); + mpn->midiProgram = 0; + mpn->parentCategoryIndex = 0; +} + +VstInt32 DrumGizmoVst::getMidiProgramCategory(VstInt32 channel, + MidiProgramCategory* cat) +{ + cat->parentCategoryIndex = -1; // -1:no parent category + cat->flags = 0; // reserved, none defined yet, zero. + VstInt32 category = cat->thisCategoryIndex; + vst_strncpy(cat->name, "Drums", 63); + return 1; +} + +bool DrumGizmoVst::hasMidiProgramsChanged(VstInt32 channel) +{ + return false; // updateDisplay() +} + +bool DrumGizmoVst::getMidiKeyName(VstInt32 channel, MidiKeyName* key) +// struct will be filled with information for 'thisProgramIndex' and +// 'thisKeyNumber' +// if keyName is "" the standard name of the key will be displayed. +// if false is returned, no MidiKeyNames defined for 'thisProgramIndex'. +{ + // key->thisProgramIndex; // >= 0. fill struct for this program index. + // key->thisKeyNumber; // 0 - 127. fill struct for this key number. + key->keyName[0] = 0; + key->reserved = 0; // zero + key->flags = 0; // reserved, none defined yet, zero. + return false; +} + +void DrumGizmoVst::setSampleRate(float sampleRate) +{ + AudioEffectX::setSampleRate(sampleRate); +} + +void DrumGizmoVst::setBlockSize(VstInt32 blockSize) +{ + AudioEffectX::setBlockSize(blockSize); +} + +void DrumGizmoVst::initProcess() +{ + drumgizmo->loadkit(getenv("DRUMGIZMO_DRUMKIT")); + drumgizmo->init(true); +} + +void DrumGizmoVst::processReplacing(float** inputs, float** outputs, + VstInt32 sampleFrames) +{ + output->setOutputs(outputs); + + if(buffer_size != sampleFrames) { + if(buffer) free(buffer); + buffer_size = sampleFrames; + buffer = (sample_t*)malloc(sizeof(sample_t) * buffer_size); + } + + drumgizmo->run(pos, buffer, buffer_size); + + pos += sampleFrames; +} + +VstInt32 DrumGizmoVst::processEvents(VstEvents* ev) +{ + input->processEvents(ev); + return 1; +} diff --git a/vst/drumgizmo_vst.h b/vst/drumgizmo_vst.h new file mode 100644 index 0000000..90c7bfc --- /dev/null +++ b/vst/drumgizmo_vst.h @@ -0,0 +1,94 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * drumgizmo_vst.h + * + * Tue Sep 20 08:22:48 CEST 2011 + * Copyright 2011 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo 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 2 of the License, or + * (at your option) any later version. + * + * DrumGizmo 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 DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef __DRUMGIZMO_DRUMGIZMO_VST_H__ +#define __DRUMGIZMO_DRUMGIZMO_VST_H__ + +#include <public.sdk/source/vst2.x/audioeffectx.h> + +#include <drumgizmo.h> + +#include "input_vst.h" +#include "output_vst.h" + +class DrumGizmoVst : public AudioEffectX +{ +public: + DrumGizmoVst(audioMasterCallback audioMaster); + ~DrumGizmoVst(); + + void processReplacing(float** inputs, float** outputs, VstInt32 sampleFrames); + VstInt32 processEvents(VstEvents* events); + + void setProgram(VstInt32 program); + void setProgramName(char* name); + void getProgramName(char* name); + bool getProgramNameIndexed(VstInt32 category, VstInt32 index, char* text); + + void setParameter(VstInt32 index, float value); + float getParameter(VstInt32 index); + void getParameterLabel(VstInt32 index, char* label); + void getParameterDisplay(VstInt32 index, char* text); + void getParameterName(VstInt32 index, char* text); + + void setSampleRate(float sampleRate); + void setBlockSize(VstInt32 blockSize); + + bool getOutputProperties(VstInt32 index, VstPinProperties* properties); + + bool getEffectName(char* name); + bool getVendorString(char* text); + bool getProductString(char* text); + VstInt32 getVendorVersion(); + VstInt32 canDo(char* text); + + VstInt32 getNumMidiInputChannels(); + VstInt32 getNumMidiOutputChannels(); + + VstInt32 getMidiProgramName(VstInt32 channel, + MidiProgramName* midiProgramName); + VstInt32 getCurrentMidiProgram(VstInt32 channel, + MidiProgramName* currentProgram); + VstInt32 getMidiProgramCategory(VstInt32 channel, + MidiProgramCategory* category); + bool hasMidiProgramsChanged(VstInt32 channel); + bool getMidiKeyName(VstInt32 channel, MidiKeyName* keyName); + +private: + void initProcess(); + // void noteOn(VstInt32 note, VstInt32 velocity, VstInt32 delta); + // void noteOff(); + void fillProgram(VstInt32 channel, VstInt32 prg, MidiProgramName* mpn); + + DrumGizmo *drumgizmo; + InputVST *input; + OutputVST *output; + size_t pos; + sample_t *buffer; + size_t buffer_size; +}; + +#endif/*__DRUMGIZMO_DRUMGIZMO_VST_H__*/ diff --git a/vst/input_vst.cc b/vst/input_vst.cc new file mode 100644 index 0000000..52015ad --- /dev/null +++ b/vst/input_vst.cc @@ -0,0 +1,112 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * input_vst.cc + * + * Tue Sep 20 10:40:10 CEST 2011 + * Copyright 2011 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo 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 2 of the License, or + * (at your option) any later version. + * + * DrumGizmo 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 DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "input_vst.h" + +#include <midimapparser.h> + +InputVST::InputVST() +{ + list = NULL; + listsize = 0; +} + +InputVST::~InputVST() +{ +} + +bool InputVST::init(Instruments &instruments) +{ + MidiMapParser p(getenv("DRUMGIZMO_MIDIMAP")); + if(p.parse()) {/*return false;*/} + mmap.midimap = p.midimap; + + for(size_t i = 0; i < instruments.size(); i++) { + mmap.instrmap[instruments[i].name()] = i; + } + + return true; +} + +void InputVST::setParm(std::string parm, std::string value) +{ +} + +bool InputVST::start() +{ + return true; +} + +void InputVST::stop() +{ +} + +void InputVST::pre() +{ +} + +event_t *InputVST::run(size_t pos, size_t len, size_t *nevents) +{ + *nevents = listsize; + return list; +} + +void InputVST::post() +{ + list = NULL; + listsize = 0; +} + +void InputVST::processEvents(VstEvents* ev) +{ + if(list == NULL) { + list = (event_t *)malloc(sizeof(event_t) * 1000); + // listsize = 0; + } + + for(VstInt32 i = 0; i < ev->numEvents; i++) { + if(ev->events[i]->type != kVstMidiType) continue; + + VstMidiEvent* event =(VstMidiEvent*)ev->events[i]; + char* midiData = event->midiData; + VstInt32 status = midiData[0] & 0xf0; // ignoring channel + if(status == 0x90) { // we only look at notes + VstInt32 note = midiData[1] & 0x7f; + VstInt32 velocity = midiData[2] & 0x7f; + + int i = mmap.lookup(note); + if(velocity && i != -1) { + list[listsize].type = TYPE_ONSET; + list[listsize].instrument = i; + list[listsize].velocity = velocity / 127.0; + list[listsize].offset = event->deltaFrames; + listsize++; + } + + } + event++; + } +} diff --git a/vst/input_vst.h b/vst/input_vst.h new file mode 100644 index 0000000..84df91a --- /dev/null +++ b/vst/input_vst.h @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * input_vst.h + * + * Tue Sep 20 10:40:10 CEST 2011 + * Copyright 2011 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo 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 2 of the License, or + * (at your option) any later version. + * + * DrumGizmo 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 DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef __DRUMGIZMO_INPUT_VST_H__ +#define __DRUMGIZMO_INPUT_VST_H__ + +#include <audioinputengine.h> +#include <midimapper.h> + +#include <public.sdk/source/vst2.x/audioeffectx.h> + +class InputVST : public AudioInputEngine { +public: + InputVST(); + ~InputVST(); + + bool init(Instruments &instruments); + + void setParm(std::string parm, std::string value); + + bool start(); + void stop(); + + void pre(); + event_t *run(size_t pos, size_t len, size_t *nevents); + void post(); + + void processEvents(VstEvents* ev); + + MidiMapper mmap; + +private: + event_t *list; + size_t listsize; +}; + +#endif/*__DRUMGIZMO_INPUT_VST_H__*/ diff --git a/vst/output_vst.cc b/vst/output_vst.cc new file mode 100644 index 0000000..5202ce7 --- /dev/null +++ b/vst/output_vst.cc @@ -0,0 +1,86 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * output_vst.cc + * + * Tue Sep 20 10:40:14 CEST 2011 + * Copyright 2011 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo 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 2 of the License, or + * (at your option) any later version. + * + * DrumGizmo 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 DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "output_vst.h" + +#include <string.h> + +#include "constants.h" + +OutputVST::OutputVST() +{ + outputs = NULL; +} + +OutputVST::~OutputVST() +{ +} + +bool OutputVST::init(Channels channels) +{ + return true; +} + +void OutputVST::setParm(std::string parm, std::string value) +{ +} + +bool OutputVST::start() +{ + return true; +} + +void OutputVST::stop() +{ +} + +void OutputVST::pre(size_t nsamples) +{ + if(!outputs) return; + + for(size_t ch = 0; ch < NUM_OUTPUTS; ch++) { + memset(outputs[ch], 0, nsamples * sizeof(sample_t)); + } +} + +void OutputVST::run(int ch, sample_t *samples, size_t nsamples) +{ + if(!outputs) return; + + if(ch < NUM_OUTPUTS) { + memcpy(outputs[ch], samples, nsamples * sizeof(sample_t)); + } +} + +void OutputVST::post(size_t nsamples) +{ + outputs = NULL; +} + +void OutputVST::setOutputs(float **outputs) +{ + this->outputs = outputs; +} diff --git a/vst/output_vst.h b/vst/output_vst.h new file mode 100644 index 0000000..fb98ad3 --- /dev/null +++ b/vst/output_vst.h @@ -0,0 +1,54 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * output_vst.h + * + * Tue Sep 20 10:40:14 CEST 2011 + * Copyright 2011 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo 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 2 of the License, or + * (at your option) any later version. + * + * DrumGizmo 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 DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef __DRUMGIZMO_OUTPUT_VST_H__ +#define __DRUMGIZMO_OUTPUT_VST_H__ + +#include <audiooutputengine.h> + +class OutputVST : public AudioOutputEngine { +public: + OutputVST(); + ~OutputVST(); + + bool init(Channels channels); + + void setParm(std::string parm, std::string value); + + bool start(); + void stop(); + + void pre(size_t nsamples); + void run(int ch, sample_t *samples, size_t nsamples); + void post(size_t nsamples); + + void setOutputs(float **outputs); + +private: + sample_t **outputs; +}; + +#endif/*__DRUMGIZMO_OUTPUT_VST_H__*/ |