@@ -74,6 +74,7 @@ HAVE_GTK3 = $(shell pkg-config --exists gtk+-3.0 && echo true) | |||
HAVE_PULSEAUDIO = $(shell pkg-config --exists libpulse-simple && echo true) | |||
HAVE_QT4 = $(shell pkg-config --exists QtCore && echo true) | |||
HAVE_QT5 = $(shell pkg-config --exists Qt5Core && echo true) | |||
HAVE_X11 = $(shell pkg-config --exists x11 && echo true) | |||
HAVE_AF_DEPS = $(shell pkg-config --exists sndfile && echo true) | |||
HAVE_MF_DEPS = $(shell pkg-config --exists smf && echo true) | |||
@@ -1996,7 +1996,7 @@ void CarlaPlugin::uiNoteOff(const uint8_t channel, const uint8_t note) | |||
bool CarlaPlugin::canRunInRack() const noexcept | |||
{ | |||
return false; // TODO | |||
return (pData->extraHints & PLUGIN_EXTRA_HINT_CAN_RUN_RACK) != 0; | |||
} | |||
CarlaEngine* CarlaPlugin::getEngine() const noexcept | |||
@@ -28,11 +28,6 @@ extern "C" { | |||
#include "rtmempool/rtmempool-lv2.h" | |||
} | |||
// ----------------------------------------------------- | |||
// Our LV2 World class object | |||
Lv2WorldClass gLv2World; | |||
// ----------------------------------------------------- | |||
CARLA_BACKEND_START_NAMESPACE | |||
@@ -1024,7 +1019,9 @@ public: | |||
if (index >= 0 && index < static_cast<int32_t>(fRdfDescriptor->PresetCount)) | |||
{ | |||
if (const LilvState* state = gLv2World.getState(fRdfDescriptor->Presets[index].URI, (const LV2_URID_Map*)fFeatures[kFeatureIdUridMap]->data)) | |||
Lv2WorldClass& lv2World(Lv2WorldClass::getInstance()); | |||
if (const LilvState* state = lv2World.getState(fRdfDescriptor->Presets[index].URI, (const LV2_URID_Map*)fFeatures[kFeatureIdUridMap]->data)) | |||
{ | |||
const ScopedSingleProcessLocker spl(this, (sendGui || sendOsc || sendCallback)); | |||
@@ -2243,7 +2240,9 @@ public: | |||
else | |||
{ | |||
// load default state | |||
if (const LilvState* state = gLv2World.getState(fDescriptor->URI, (const LV2_URID_Map*)fFeatures[kFeatureIdUridMap]->data)) | |||
Lv2WorldClass& lv2World(Lv2WorldClass::getInstance()); | |||
if (const LilvState* state = lv2World.getState(fDescriptor->URI, (const LV2_URID_Map*)fFeatures[kFeatureIdUridMap]->data)) | |||
{ | |||
lilv_state_restore(state, fExt.state, fHandle, carla_lilv_set_port_value, this, 0, fFeatures); | |||
@@ -4150,7 +4149,8 @@ public: | |||
// --------------------------------------------------------------- | |||
// get plugin from lv2_rdf (lilv) | |||
gLv2World.init(); | |||
Lv2WorldClass& lv2World(Lv2WorldClass::getInstance()); | |||
lv2World.init(); | |||
fRdfDescriptor = lv2_rdf_new(uri, true); | |||
@@ -4474,11 +4474,12 @@ public: | |||
int eQt4, eQt5, eCocoa, eWindows, eX11, eGtk2, eGtk3, iCocoa, iWindows, iX11, iQt4, iQt5, iExt, iFinal; | |||
eQt4 = eQt5 = eCocoa = eWindows = eX11 = eGtk2 = eGtk3 = iQt4 = iQt5 = iCocoa = iWindows = iX11 = iExt = iFinal = -1; | |||
#ifdef BUILD_BRIDGE | |||
const bool preferUiBridges(pData->engine->getOptions().preferUiBridges); | |||
#else | |||
const bool preferUiBridges(pData->engine->getOptions().preferUiBridges && (fHints & PLUGIN_IS_BRIDGE) == 0); | |||
#endif | |||
const bool preferUiBridges(true); | |||
//#ifdef BUILD_BRIDGE | |||
// const bool preferUiBridges(pData->engine->getOptions().preferUiBridges); | |||
//#else | |||
// const bool preferUiBridges(pData->engine->getOptions().preferUiBridges && (fHints & PLUGIN_IS_BRIDGE) == 0); | |||
//#endif | |||
for (uint32_t i=0; i < fRdfDescriptor->UICount; ++i) | |||
{ | |||
@@ -337,6 +337,7 @@ bool carla_engine_init(const char* driverName, const char* clientName) | |||
gStandalone.engine->setCallback(gStandalone.callback, nullptr); | |||
#ifndef BUILD_BRIDGE | |||
gStandalone.engine->setOption(CB::OPTION_PROCESS_MODE, static_cast<int>(gStandalone.options.processMode), nullptr); | |||
gStandalone.engine->setOption(CB::OPTION_TRANSPORT_MODE, static_cast<int>(gStandalone.options.transportMode), nullptr); | |||
#endif | |||
gStandalone.engine->setOption(CB::OPTION_FORCE_STEREO, gStandalone.options.forceStereo ? 1 : 0, nullptr); | |||
@@ -8,13 +8,9 @@ include ../Makefile.mk | |||
# -------------------------------------------------------------- | |||
ifeq ($(HAVE_QT4),true) | |||
QT_UI_FLAGS = $(shell pkg-config --cflags QtGui) | |||
QT_UI_LIBS = $(shell pkg-config --libs QtGui) | |||
else | |||
QT_UI_FLAGS = $(shell pkg-config --cflags Qt5Gui Qt5Widgets) | |||
QT_UI_LIBS = $(shell pkg-config --libs Qt5Gui Qt5Widgets) | |||
endif | |||
# TODO: remove in favour of juce gui stuff | |||
QT5_UI_FLAGS = $(shell pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets) | |||
QT5_UI_LIBS = $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Widgets) | |||
# -------------------------------------------------------------- | |||
@@ -23,14 +19,6 @@ BUILD_CXX_FLAGS += -I. -I../backend -I../includes -I../modules -I../modules/them | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags liblo) | |||
LINK_FLAGS += $(shell pkg-config --libs liblo) | |||
ifeq ($(HAVE_QT4),true) | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore) | |||
LINK_FLAGS += $(shell pkg-config --libs QtCore) | |||
else | |||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags Qt5Core) | |||
LINK_FLAGS += $(shell pkg-config --libs Qt5Core) | |||
endif | |||
# -------------------------------------------------------------- | |||
# Plugin bridges | |||
@@ -45,14 +33,6 @@ BUILD_PLUGIN_FLAGS += -DVESTIGE_HEADER | |||
endif | |||
endif | |||
ifeq ($(HAVE_QT4),true) | |||
BUILD_PLUGIN_FLAGS += $(shell pkg-config --cflags QtGui QtXml) | |||
LINK_PLUGIN_FLAGS += $(shell pkg-config --libs QtGui QtXml) | |||
else | |||
BUILD_PLUGIN_FLAGS += $(shell pkg-config --cflags Qt5Gui Qt5Widgets Qt5Xml) | |||
LINK_PLUGIN_FLAGS += $(shell pkg-config --libs Qt5Gui Qt5Widgets Qt5Xml) | |||
endif | |||
# -------------------------------------------------------------- | |||
# Plugin bridges (POSIX) | |||
@@ -138,35 +118,35 @@ ifeq ($(CARLA_VESTIGE_HEADER),true) | |||
BUILD_UI_VST_FLAGS += -DVESTIGE_HEADER | |||
endif | |||
BUILD_UI_LV2_GTK2_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_GTK2 -DBRIDGE_LV2_GTK2 $(shell pkg-config --cflags gtk+-2.0) | |||
LINK_UI_LV2_GTK2_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs gtk+-2.0) | |||
BUILD_UI_LV2_GTK2_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_GTK2 -DBRIDGE_LV2_GTK2 $(shell pkg-config --cflags gtk+-2.0 Qt5Core) | |||
LINK_UI_LV2_GTK2_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs gtk+-2.0 Qt5Core) | |||
BUILD_UI_LV2_GTK3_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_GTK3 -DBRIDGE_LV2_GTK3 $(shell pkg-config --cflags gtk+-3.0) | |||
LINK_UI_LV2_GTK3_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs gtk+-3.0) | |||
BUILD_UI_LV2_GTK3_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_GTK3 -DBRIDGE_LV2_GTK3 $(shell pkg-config --cflags gtk+-3.0 Qt5Core) | |||
LINK_UI_LV2_GTK3_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs gtk+-3.0 Qt5Core) | |||
BUILD_UI_LV2_QT4_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_QT4 -DBRIDGE_LV2_QT4 $(shell pkg-config --cflags QtGui) | |||
LINK_UI_LV2_QT4_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs QtGui) | |||
BUILD_UI_LV2_QT4_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_QT4 -DBRIDGE_LV2_QT4 $(shell pkg-config --cflags QtCore QtGui) | |||
LINK_UI_LV2_QT4_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs QtCore QtGui) | |||
BUILD_UI_LV2_QT5_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_QT5 -DBRIDGE_LV2_QT5 $(shell pkg-config --cflags Qt5Gui Qt5Widgets) | |||
LINK_UI_LV2_QT5_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs Qt5Gui Qt5Widgets) | |||
BUILD_UI_LV2_QT5_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_QT5 -DBRIDGE_LV2_QT5 $(shell pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets) | |||
LINK_UI_LV2_QT5_FLAGS = $(LINK_UI_FLAGS) $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Widgets) | |||
BUILD_UI_LV2_COCOA_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_COCOA -DBRIDGE_LV2_COCOA $(QT_UI_FLAGS) | |||
LINK_UI_LV2_COCOA_FLAGS = $(LINK_UI_FLAGS) $(QT_UI_LIBS) | |||
BUILD_UI_LV2_COCOA_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_COCOA -DBRIDGE_LV2_COCOA $(QT5_UI_FLAGS) | |||
LINK_UI_LV2_COCOA_FLAGS = $(LINK_UI_FLAGS) $(QT5_UI_LIBS) | |||
BUILD_UI_LV2_WIN32_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_HWND -DBRIDGE_LV2_WIN32 $(QT_UI_FLAGS) | |||
LINK_UI_LV2_WIN32_FLAGS = $(LINK_FLAGS) $(QT_UI_LIBS) $(EXTRA_LIBS) -mwindows -lwinspool -lole32 -luuid -limm32 -lshell32 -lws2_32 -static | |||
BUILD_UI_LV2_WIN32_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_HWND -DBRIDGE_LV2_WIN32 $(QT5_UI_FLAGS) | |||
LINK_UI_LV2_WIN32_FLAGS = $(LINK_FLAGS) $(QT5_UI_LIBS) $(EXTRA_LIBS) -mwindows -lwinspool -lole32 -luuid -limm32 -lshell32 -lws2_32 -static | |||
BUILD_UI_LV2_X11_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_X11 -DBRIDGE_LV2_X11 $(QT_UI_FLAGS) | |||
LINK_UI_LV2_X11_FLAGS = $(LINK_UI_FLAGS) $(QT_UI_LIBS) | |||
BUILD_UI_LV2_X11_FLAGS = $(BUILD_UI_LV2_FLAGS) -DBRIDGE_X11 -DBRIDGE_LV2_X11 $(QT5_UI_FLAGS) | |||
LINK_UI_LV2_X11_FLAGS = $(LINK_UI_FLAGS) $(QT5_UI_LIBS) | |||
BUILD_UI_VST_MAC_FLAGS = $(BUILD_UI_VST_FLAGS) -DBRIDGE_MAC -DBRIDGE_VST_MAC $(QT_UI_FLAGS) | |||
LINK_UI_VST_MAC_FLAGS = $(LINK_UI_FLAGS) $(QT_UI_LIBS) | |||
BUILD_UI_VST_MAC_FLAGS = $(BUILD_UI_VST_FLAGS) -DBRIDGE_MAC -DBRIDGE_VST_MAC $(QT5_UI_FLAGS) | |||
LINK_UI_VST_MAC_FLAGS = $(LINK_UI_FLAGS) $(QT5_UI_LIBS) | |||
BUILD_UI_VST_HWND_FLAGS = $(BUILD_UI_VST_FLAGS) -DBRIDGE_HWND -DBRIDGE_VST_HWND $(QT_UI_FLAGS) | |||
LINK_UI_VST_HWND_FLAGS = $(LINK_FLAGS) $(QT_UI_LIBS) $(EXTRA_LIBS) -mwindows -lwinspool -lole32 -luuid -limm32 -lshell32 -lws2_32 -static | |||
BUILD_UI_VST_HWND_FLAGS = $(BUILD_UI_VST_FLAGS) -DBRIDGE_HWND -DBRIDGE_VST_HWND $(QT5_UI_FLAGS) | |||
LINK_UI_VST_HWND_FLAGS = $(LINK_FLAGS) $(QT5_UI_LIBS) $(EXTRA_LIBS) -mwindows -lwinspool -lole32 -luuid -limm32 -lshell32 -lws2_32 -static | |||
BUILD_UI_VST_X11_FLAGS = $(BUILD_UI_VST_FLAGS) -DBRIDGE_X11 -DBRIDGE_VST_X11 $(QT_UI_FLAGS) | |||
LINK_UI_VST_X11_FLAGS = $(LINK_UI_FLAGS) $(QT_UI_LIBS) | |||
BUILD_UI_VST_X11_FLAGS = $(BUILD_UI_VST_FLAGS) -DBRIDGE_X11 -DBRIDGE_VST_X11 $(QT5_UI_FLAGS) | |||
LINK_UI_VST_X11_FLAGS = $(LINK_UI_FLAGS) $(QT5_UI_LIBS) | |||
# -------------------------------------------------------------- | |||
@@ -371,12 +351,6 @@ carla-bridge-vst-x11: $(OBJS_UI_VST_X11) $(OBJS_UI_VST_LIBS) ../modules/theme.a | |||
%__vst-x11.o: %.cpp CarlaBridgeToolkitQt.moc | |||
$(CXX) $< $(BUILD_UI_VST_X11_FLAGS) -c -o $@ | |||
# -------------------------------------------------------------- | |||
# plugin common | |||
FILES = \ | |||
../backend/plugin/moc_CarlaPluginGui.cpp | |||
# -------------------------------------------------------------- | |||
# native | |||
@@ -394,7 +368,6 @@ OBJS_NATIVE += \ | |||
# carla-plugin | |||
OBJS_NATIVE += \ | |||
../backend/plugin/CarlaPlugin__native.o \ | |||
../backend/plugin/CarlaPluginGui__native.o \ | |||
../backend/plugin/CarlaPluginThread__native.o \ | |||
../backend/plugin/NativePlugin__native.o \ | |||
../backend/plugin/LadspaPlugin__native.o \ | |||
@@ -415,6 +388,8 @@ OBJS_NATIVE += \ | |||
../modules/dgl.a \ | |||
../modules/juce_audio_basics.a \ | |||
../modules/juce_core.a \ | |||
../modules/juce_data_structures.a \ | |||
../modules/juce_events.a \ | |||
../modules/rtmempool.a | |||
ifeq ($(CARLA_PLUGIN_SUPPORT),true) | |||
@@ -445,7 +420,6 @@ OBJS_POSIX32 += \ | |||
# carla-plugin | |||
OBJS_POSIX32 += \ | |||
../backend/plugin/CarlaPlugin__posix32.o \ | |||
../backend/plugin/CarlaPluginGui__posix32.o \ | |||
../backend/plugin/CarlaPluginThread__posix32.o \ | |||
../backend/plugin/NativePlugin__posix32.o \ | |||
../backend/plugin/LadspaPlugin__posix32.o \ | |||
@@ -488,7 +462,6 @@ OBJS_POSIX64 += \ | |||
# carla-plugin | |||
OBJS_POSIX64 += \ | |||
../backend/plugin/CarlaPlugin__posix64.o \ | |||
../backend/plugin/CarlaPluginGui__posix64.o \ | |||
../backend/plugin/CarlaPluginThread__posix64.o \ | |||
../backend/plugin/NativePlugin__posix64.o \ | |||
../backend/plugin/LadspaPlugin__posix64.o \ | |||
@@ -531,7 +504,6 @@ OBJS_WIN32 += \ | |||
# carla-plugin | |||
OBJS_WIN32 += \ | |||
../backend/plugin/CarlaPlugin__win32.o \ | |||
../backend/plugin/CarlaPluginGui__win32.o \ | |||
../backend/plugin/CarlaPluginThread__win32.o \ | |||
../backend/plugin/NativePlugin__win32.o \ | |||
../backend/plugin/LadspaPlugin__win32.o \ | |||
@@ -574,7 +546,6 @@ OBJS_WIN64 += \ | |||
# carla-plugin | |||
OBJS_WIN64 += \ | |||
../backend/plugin/CarlaPlugin__win64.o \ | |||
../backend/plugin/CarlaPluginGui__win64.o \ | |||
../backend/plugin/CarlaPluginThread__win64.o \ | |||
../backend/plugin/NativePlugin__win64.o \ | |||
../backend/plugin/LadspaPlugin__win64.o \ | |||
@@ -602,11 +573,6 @@ carla-bridge-win64.exe: $(FILES) $(OBJS_WIN64) ../modules/jackbridge-win64.dll | |||
# -------------------------------------------------------------- | |||
../backend/plugin/moc_%.cpp: ../backend/plugin/%.hpp | |||
$(MOC) $< -DMOC_PARSING -o $@ | |||
# -------------------------------------------------------------- | |||
.FORCE: | |||
.PHONY: .FORCE | |||
@@ -72,6 +72,11 @@ if __name__ == '__main__': | |||
# ------------------------------------------------------------- | |||
# Init host backend | |||
Carla.isControl = False | |||
Carla.isLocal = True | |||
Carla.isPlugin = False | |||
Carla.processMode = PROCESS_MODE_CONTINUOUS_RACK | |||
initHost(appName, libPrefix) | |||
# ------------------------------------------------------------- | |||
@@ -322,7 +322,6 @@ class HostWindow(QMainWindow): | |||
uisAlwaysOnTop = settings.value("Engine/OscUiTimeout", CARLA_DEFAULT_UIS_ALWAYS_ON_TOP, type=bool) | |||
uiBridgesTimeout = settings.value("Engine/OscUiTimeout", CARLA_DEFAULT_UI_BRIDGES_TIMEOUT, type=int) | |||
Carla.processMode = settings.value("Engine/ProcessMode", CARLA_DEFAULT_PROCESS_MODE, type=int) | |||
Carla.maxParameters = settings.value("Engine/MaxParameters", CARLA_DEFAULT_MAX_PARAMETERS, type=int) | |||
audioDriver = settings.value("Engine/AudioDriver", CARLA_DEFAULT_AUDIO_DRIVER, type=str) | |||
@@ -344,7 +343,7 @@ class HostWindow(QMainWindow): | |||
if Carla.processMode == PROCESS_MODE_CONTINUOUS_RACK: | |||
forceStereo = True | |||
elif Carla.processMode == PROCESS_MODE_MULTIPLE_CLIENTS: # and LADISH_APP_NAME: | |||
elif Carla.processMode == PROCESS_MODE_MULTIPLE_CLIENTS and LADISH_APP_NAME: | |||
print("LADISH detected but using multiple clients (not allowed), forcing single client now") | |||
Carla.processMode = PROCESS_MODE_SINGLE_CLIENT | |||
@@ -55,7 +55,8 @@ OBJS = \ | |||
# Simple plugins (C++) | |||
OBJS += \ | |||
vex.cpp.o | |||
vex.cpp.o \ | |||
vex-src.cpp.o | |||
# AudioFile | |||
ifeq ($(HAVE_AF_DEPS),true) | |||
@@ -0,0 +1,34 @@ | |||
/* | |||
* Carla Native Plugins | |||
* Copyright (C) 2013 Filipe Coelho <falktx@falktx.com> | |||
* | |||
* This program 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 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. | |||
* | |||
* For a full copy of the GNU General Public License see the doc/GPL.txt file. | |||
*/ | |||
#include "CarlaNative.hpp" | |||
#include "juce_core.h" | |||
using namespace juce; | |||
// ----------------------------------------------------------------------- | |||
#include "vex/freeverb/allpass.cpp" | |||
#include "vex/freeverb/comb.cpp" | |||
#include "vex/freeverb/revmodel.cpp" | |||
#include "vex/ResourceFile.cpp" | |||
#include "vex/VexVoice.cpp" | |||
#include "vex/VexWaveRenderer.cpp" | |||
// ----------------------------------------------------------------------- |
@@ -234,7 +234,6 @@ protected: | |||
const TimeInfo* const timeInfo(getTimeInfo()); | |||
int timeFrame = 0; | |||
bool timePlaying = false; | |||
double ppqPos = 0.0; | |||
double barStartPos = 0.0; | |||
@@ -242,7 +241,6 @@ protected: | |||
if (timeInfo != nullptr) | |||
{ | |||
timeFrame = timeInfo->frame; | |||
timePlaying = timeInfo->playing; | |||
if (timeInfo->bbt.valid) | |||
@@ -310,8 +308,8 @@ class VexChorusPlugin : public PluginClass | |||
{ | |||
public: | |||
enum Params { | |||
kParamDepth = 0, | |||
kParamRate, | |||
kParamRate = 0, | |||
kParamDepth, | |||
kParamCount | |||
}; | |||
@@ -319,8 +317,10 @@ public: | |||
: PluginClass(host), | |||
fChorus(fParameters) | |||
{ | |||
fParameters[0] = 0.6f; | |||
fParameters[1] = 0.3f; | |||
std::memset(fParameters, 0, sizeof(float)*92); | |||
fParameters[76] = 0.3f; | |||
fParameters[77] = 0.6f; | |||
fChorus.setSampleRate(getSampleRate()); | |||
} | |||
@@ -353,18 +353,18 @@ protected: | |||
switch (index) | |||
{ | |||
case kParamDepth: | |||
paramInfo.name = "Depth"; | |||
paramInfo.ranges.def = 0.6f; | |||
paramInfo.ranges.min = 0.0f; | |||
paramInfo.ranges.max = 1.0f; | |||
break; | |||
case kParamRate: | |||
paramInfo.name = "Rate"; | |||
paramInfo.ranges.def = 0.3f; | |||
paramInfo.ranges.min = 0.0f; | |||
paramInfo.ranges.max = 1.0f; | |||
break; | |||
case kParamDepth: | |||
paramInfo.name = "Depth"; | |||
paramInfo.ranges.def = 0.6f; | |||
paramInfo.ranges.min = 0.0f; | |||
paramInfo.ranges.max = 1.0f; | |||
break; | |||
} | |||
paramInfo.hints = static_cast<ParameterHints>(hints); | |||
@@ -374,7 +374,15 @@ protected: | |||
float getParameterValue(const uint32_t index) const override | |||
{ | |||
return (index < kParamCount) ? fParameters[index] : 0.0f; | |||
switch (index) | |||
{ | |||
case kParamRate: | |||
return fParameters[76]; | |||
case kParamDepth: | |||
return fParameters[77]; | |||
default: | |||
return 0.0f; | |||
} | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -382,8 +390,17 @@ protected: | |||
void setParameterValue(const uint32_t index, const float value) override | |||
{ | |||
if (index < kParamCount) | |||
fParameters[index] = value; | |||
switch (index) | |||
{ | |||
case kParamRate: | |||
fParameters[76] = value; | |||
break; | |||
case kParamDepth: | |||
fParameters[77] = value; | |||
break; | |||
default: | |||
break; | |||
} | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -409,7 +426,7 @@ protected: | |||
private: | |||
VexChorus fChorus; | |||
float fParameters[2]; | |||
float fParameters[92]; | |||
PluginClassEND(VexChorusPlugin) | |||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VexChorusPlugin) | |||
@@ -430,8 +447,10 @@ public: | |||
: PluginClass(host), | |||
fDelay(fParameters) | |||
{ | |||
fParameters[0] = 4.0f; | |||
fParameters[1] = 40.0f; | |||
std::memset(fParameters, 0, sizeof(float)*92); | |||
fParameters[73] = 0.5f * 8.0f; | |||
fParameters[74] = 0.4f * 100.0f; | |||
fDelay.setSampleRate(getSampleRate()); | |||
} | |||
@@ -487,7 +506,15 @@ protected: | |||
float getParameterValue(const uint32_t index) const override | |||
{ | |||
return (index < kParamCount) ? fParameters[index] : 0.0f; | |||
switch (index) | |||
{ | |||
case kParamTime: | |||
return fParameters[73] * 8.0f; | |||
case kParamFeedback: | |||
return fParameters[74] * 100.0f; | |||
default: | |||
return 0.0f; | |||
} | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -495,8 +522,17 @@ protected: | |||
void setParameterValue(const uint32_t index, const float value) override | |||
{ | |||
if (index < kParamCount) | |||
fParameters[index] = value; | |||
switch (index) | |||
{ | |||
case kParamTime: | |||
fParameters[73] = value/8.0f; | |||
break; | |||
case kParamFeedback: | |||
fParameters[74] = value/100.0f; | |||
break; | |||
default: | |||
break; | |||
} | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -525,7 +561,7 @@ protected: | |||
private: | |||
VexDelay fDelay; | |||
float fParameters[2]; | |||
float fParameters[92]; | |||
PluginClassEND(VexDelayPlugin) | |||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VexDelayPlugin) | |||
@@ -547,9 +583,12 @@ public: | |||
: PluginClass(host), | |||
fReverb(fParameters) | |||
{ | |||
fParameters[0] = 0.6f; | |||
fParameters[1] = 0.7f; | |||
fParameters[2] = 0.6f; | |||
std::memset(fParameters, 0, sizeof(float)*92); | |||
// FIXME? | |||
fParameters[79] = 0.6f; | |||
fParameters[80] = 0.6f; | |||
fParameters[81] = 0.7f; | |||
} | |||
protected: | |||
@@ -607,7 +646,17 @@ protected: | |||
float getParameterValue(const uint32_t index) const override | |||
{ | |||
return (index < kParamCount) ? fParameters[index] : 0.0f; | |||
switch (index) | |||
{ | |||
case kParamSize: | |||
return fParameters[79]; | |||
case kParamWidth: | |||
return fParameters[80]; | |||
case kParamDamp: | |||
return fParameters[81]; | |||
default: | |||
return 0.0f; | |||
} | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -615,8 +664,20 @@ protected: | |||
void setParameterValue(const uint32_t index, const float value) override | |||
{ | |||
if (index < kParamCount) | |||
fParameters[index] = value; | |||
switch (index) | |||
{ | |||
case kParamSize: | |||
fParameters[79] = value; | |||
break; | |||
case kParamWidth: | |||
fParameters[80] = value; | |||
break; | |||
case kParamDamp: | |||
fParameters[81] = value; | |||
break; | |||
default: | |||
break; | |||
} | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -634,7 +695,7 @@ protected: | |||
private: | |||
VexReverb fReverb; | |||
float fParameters[3]; | |||
float fParameters[92]; | |||
PluginClassEND(VexReverbPlugin) | |||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VexReverbPlugin) | |||
@@ -645,14 +706,24 @@ private: | |||
class VexSynthPlugin : public PluginClass | |||
{ | |||
public: | |||
static const unsigned int kParamCount = 1; | |||
static const unsigned int kParamCount = 92; | |||
VexSynthPlugin(const HostDescriptor* const host) | |||
: PluginClass(host), | |||
obf(nullptr), | |||
abf(nullptr), | |||
dbf1(nullptr), | |||
dbf2(nullptr), | |||
dbf3(nullptr), | |||
fChorus(fParameters), | |||
fDelay(fParameters), | |||
fReverb(fParameters), | |||
fSynth(fParameters) | |||
{ | |||
std::memset(fParameters, 0, sizeof(float)*92); | |||
fParameters[0] = 1.0f; // main volume | |||
for (int i = 0; i < 3; ++i) | |||
{ | |||
const int offset = i * 24; | |||
@@ -683,13 +754,44 @@ public: | |||
fParameters[offset + 24] = 0.5f; | |||
} | |||
// ^1 - 72 | |||
fParameters[73] = 0.5f; // Delay Time | |||
fParameters[74] = 0.4f; // Delay Feedback | |||
fParameters[75] = 0.0f; // Delay Volume | |||
fParameters[76] = 0.3f; // Chorus Rate | |||
fParameters[77] = 0.6f; // Chorus Depth | |||
fParameters[78] = 0.5f; // Chorus Volume | |||
fParameters[79] = 0.6f; // Reverb Size | |||
fParameters[80] = 0.7f; // Reverb Width | |||
fParameters[81] = 0.6f; // Reverb Damp | |||
fParameters[82] = 0.0f; // Reverb Volume | |||
fParameters[83] = 0.5f; // wave1 panning | |||
fParameters[84] = 0.5f; // wave2 panning | |||
fParameters[85] = 0.5f; // wave3 panning | |||
fParameters[86] = 0.5f; // wave1 volume | |||
fParameters[87] = 0.5f; // wave2 volume | |||
fParameters[88] = 0.5f; // wave3 volume | |||
fParameters[89] = 1.0f; // wave1 on/off | |||
fParameters[90] = 1.0f; // wave2 on/off | |||
fParameters[91] = 1.0f; // wave3 on/off | |||
fParameters[89] = 1.0f; | |||
bufferSizeChanged(getBufferSize()); | |||
sampleRateChanged(getSampleRate()); | |||
} | |||
fSynth.setSampleRate(getSampleRate()); | |||
fSynth.update(89); | |||
~VexSynthPlugin() | |||
{ | |||
delete obf; | |||
delete abf; | |||
delete dbf1; | |||
delete dbf2; | |||
delete dbf3; | |||
} | |||
protected: | |||
@@ -712,25 +814,168 @@ protected: | |||
paramInfo.ranges.def = 0.0f; | |||
paramInfo.ranges.min = 0.0f; | |||
paramInfo.ranges.max = 1.0f; | |||
paramInfo.ranges.step = 1.0f; | |||
paramInfo.ranges.stepSmall = 1.0f; | |||
paramInfo.ranges.stepLarge = 1.0f; | |||
paramInfo.ranges.step = PARAMETER_RANGES_DEFAULT_STEP; | |||
paramInfo.ranges.stepSmall = PARAMETER_RANGES_DEFAULT_STEP_SMALL; | |||
paramInfo.ranges.stepLarge = PARAMETER_RANGES_DEFAULT_STEP_LARGE; | |||
paramInfo.scalePointCount = 0; | |||
paramInfo.scalePoints = nullptr; | |||
if (index >= 1 && index <= 72) | |||
{ | |||
uint32_t ri = index % 24; | |||
switch (ri) | |||
{ | |||
case 1: | |||
paramInfo.name = "oct"; | |||
break; | |||
case 2: | |||
paramInfo.name = "cent"; | |||
break; | |||
case 3: | |||
paramInfo.name = "phaseOffset"; | |||
break; | |||
case 4: | |||
paramInfo.name = "phaseIncOffset"; | |||
break; | |||
case 5: | |||
paramInfo.name = "filter"; | |||
break; | |||
case 6: | |||
paramInfo.name = "filter"; | |||
break; | |||
case 7: | |||
paramInfo.name = "filter"; | |||
break; | |||
case 8: | |||
paramInfo.name = "filter"; | |||
break; | |||
case 9: | |||
paramInfo.name = "F ADSR"; | |||
break; | |||
case 10: | |||
paramInfo.name = "F ADSR"; | |||
break; | |||
case 11: | |||
paramInfo.name = "F ADSR"; | |||
break; | |||
case 12: | |||
paramInfo.name = "F ADSR"; | |||
break; | |||
case 13: | |||
paramInfo.name = "F velocity"; | |||
break; | |||
case 14: | |||
paramInfo.name = "A ADSR"; | |||
break; | |||
case 15: | |||
paramInfo.name = "A ADSR"; | |||
break; | |||
case 16: | |||
paramInfo.name = "A ADSR"; | |||
break; | |||
case 17: | |||
paramInfo.name = "A ADSR"; | |||
break; | |||
case 18: | |||
paramInfo.name = "A velocity"; | |||
break; | |||
case 19: | |||
paramInfo.name = "lfoC"; | |||
break; | |||
case 20: | |||
paramInfo.name = "lfoA"; | |||
break; | |||
case 21: | |||
paramInfo.name = "lfoF"; | |||
break; | |||
case 22: | |||
paramInfo.name = "fx vol D"; | |||
break; | |||
case 23: | |||
paramInfo.name = "fx vol C"; | |||
break; | |||
case 24: | |||
case 0: | |||
paramInfo.name = "fx vol R"; | |||
break; | |||
default: | |||
paramInfo.name = "unknown2"; | |||
break; | |||
} | |||
paramInfo.hints = static_cast<ParameterHints>(hints); | |||
return ¶mInfo; | |||
} | |||
switch (index) | |||
{ | |||
case 0: | |||
hints |= PARAMETER_IS_INTEGER; | |||
paramInfo.name = "Wave"; | |||
paramInfo.ranges.def = 0.0f; | |||
paramInfo.ranges.min = 0.0f; | |||
paramInfo.ranges.max = WaveRenderer::getWaveTableSize(); | |||
paramInfo.name = "Main volume"; | |||
break; | |||
case 73: | |||
paramInfo.name = "Delay Time"; | |||
break; | |||
case 74: | |||
paramInfo.name = "Delay Feedback"; | |||
break; | |||
case 75: | |||
paramInfo.name = "Delay Volume"; | |||
break; | |||
case 76: | |||
paramInfo.name = "Chorus Rate"; | |||
break; | |||
case 77: | |||
paramInfo.name = "Chorus Depth"; | |||
break; | |||
case 78: | |||
paramInfo.name = "Chorus Volume"; | |||
break; | |||
case 79: | |||
paramInfo.name = "Reverb Size"; | |||
break; | |||
case 80: | |||
paramInfo.name = "Reverb Width"; | |||
break; | |||
case 81: | |||
paramInfo.name = "Reverb Damp"; | |||
break; | |||
case 82: | |||
paramInfo.name = "Reverb Volume"; | |||
break; | |||
case 83: | |||
paramInfo.name = "Wave1 Panning"; | |||
break; | |||
case 84: | |||
paramInfo.name = "Wave2 Panning"; | |||
break; | |||
case 85: | |||
paramInfo.name = "Wave3 Panning"; | |||
break; | |||
case 86: | |||
paramInfo.name = "Wave1 Volume"; | |||
break; | |||
case 87: | |||
paramInfo.name = "Wave2 Volume"; | |||
break; | |||
case 88: | |||
paramInfo.name = "Wave3 Volume"; | |||
break; | |||
case 89: | |||
paramInfo.name = "Wave1 on/off"; | |||
break; | |||
case 90: | |||
paramInfo.name = "Wave2 on/off"; | |||
break; | |||
case 91: | |||
paramInfo.name = "Wave3 on/off"; | |||
break; | |||
default: | |||
paramInfo.name = "unknown"; | |||
break; | |||
} | |||
paramInfo.hints = static_cast<ParameterHints>(hints); | |||
return ¶mInfo; | |||
} | |||
@@ -747,9 +992,7 @@ protected: | |||
if (index < kParamCount) | |||
{ | |||
fParameters[index] = value; | |||
fSynth.setWaveLater(1, WaveRenderer::getWaveTableName(value)); | |||
//synth.update(index); | |||
fSynth.update(index); | |||
} | |||
} | |||
@@ -758,6 +1001,9 @@ protected: | |||
void process(float**, float** outBuffer, const uint32_t frames, const MidiEvent* const midiEvents, const uint32_t midiEventCount) override | |||
{ | |||
const TimeInfo* const timeInfo(getTimeInfo()); | |||
const double bpm((timeInfo != nullptr && timeInfo->bbt.valid) ? timeInfo->bbt.beatsPerMinute : 120.0); | |||
for (uint32_t i=0; i < midiEventCount; ++i) | |||
{ | |||
const MidiEvent* const midiEvent(&midiEvents[i]); | |||
@@ -783,24 +1029,79 @@ protected: | |||
} | |||
} | |||
carla_zeroFloat(outBuffer[0], frames); | |||
carla_zeroFloat(outBuffer[1], frames); | |||
if (obf->getNumSamples() != frames) | |||
{ | |||
obf->setSize(2, frames, 0, 0, 1); | |||
abf->setSize(2, frames, 0, 0, 1); | |||
dbf1->setSize(2, frames, 0, 0, 1); | |||
dbf2->setSize(2, frames, 0, 0, 1); | |||
dbf3->setSize(2, frames, 0, 0, 1); | |||
} | |||
obf ->clear(); | |||
dbf1->clear(); | |||
dbf2->clear(); | |||
dbf3->clear(); | |||
fSynth.doProcess(*obf, *abf, *dbf1, *dbf2, *dbf3); | |||
fSynth.doProcess(outBuffer[0], outBuffer[1], frames); | |||
if (fParameters[75] > 0.001f) fDelay.processBlock(dbf1, bpm); | |||
if (fParameters[78] > 0.001f) fChorus.processBlock(dbf2); | |||
if (fParameters[82] > 0.001f) fReverb.processBlock(dbf3); | |||
AudioSampleBuffer output(outBuffer, 2, 0, frames); | |||
output.clear(); | |||
obf->addFrom(0, 0, *dbf1, 0, 0, frames, fParameters[75]); | |||
obf->addFrom(1, 0, *dbf1, 1, 0, frames, fParameters[75]); | |||
obf->addFrom(0, 0, *dbf2, 0, 0, frames, fParameters[78]); | |||
obf->addFrom(1, 0, *dbf2, 1, 0, frames, fParameters[78]); | |||
obf->addFrom(0, 0, *dbf3, 0, 0, frames, fParameters[82]); | |||
obf->addFrom(1, 0, *dbf3, 1, 0, frames, fParameters[82]); | |||
output.addFrom(0, 0, *obf, 0, 0, frames, fParameters[0]); | |||
output.addFrom(1, 0, *obf, 1, 0, frames, fParameters[0]); | |||
} | |||
// ------------------------------------------------------------------- | |||
// Plugin dispatcher calls | |||
void bufferSizeChanged(const uint32_t bufferSize) override | |||
{ | |||
delete obf; | |||
delete abf; | |||
delete dbf1; | |||
delete dbf2; | |||
delete dbf3; | |||
obf = new AudioSampleBuffer(2, bufferSize); | |||
abf = new AudioSampleBuffer(2, bufferSize); | |||
dbf1 = new AudioSampleBuffer(2, bufferSize); | |||
dbf2 = new AudioSampleBuffer(2, bufferSize); | |||
dbf3 = new AudioSampleBuffer(2, bufferSize); | |||
} | |||
void sampleRateChanged(const double sampleRate) override | |||
{ | |||
fChorus.setSampleRate(sampleRate); | |||
fDelay.setSampleRate(sampleRate); | |||
fSynth.setSampleRate(sampleRate); | |||
} | |||
private: | |||
VexSyntModule fSynth; | |||
float fParameters[92]; | |||
AudioSampleBuffer* obf; | |||
AudioSampleBuffer* abf; | |||
AudioSampleBuffer* dbf1; // delay | |||
AudioSampleBuffer* dbf2; // chorus | |||
AudioSampleBuffer* dbf3; // reverb | |||
VexChorus fChorus; | |||
VexDelay fDelay; | |||
VexReverb fReverb; | |||
VexSyntModule fSynth; | |||
PluginClassEND(VexSynthPlugin) | |||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VexSynthPlugin) | |||
}; | |||
@@ -905,13 +1206,3 @@ void carla_register_native_plugin_vex() | |||
} | |||
// ----------------------------------------------------------------------- | |||
#include "vex/freeverb/allpass.cpp" | |||
#include "vex/freeverb/comb.cpp" | |||
#include "vex/freeverb/revmodel.cpp" | |||
#include "vex/ResourceFile.cpp" | |||
#include "vex/VexVoice.cpp" | |||
#include "vex/VexWaveRenderer.cpp" | |||
// ----------------------------------------------------------------------- |
@@ -54,15 +54,16 @@ public: | |||
lastlfo1(0.0f), | |||
lastlfo2(0.0f), | |||
parameters(p), | |||
sampleRate(44100.0f), | |||
cycle(44100 / 32), | |||
iRead(cycle * 0.5f), | |||
sampleRate(0.0f), | |||
cycle(0), | |||
iRead(0), | |||
iWrite(0), | |||
buffer(2, cycle) | |||
buffer(2, 0) | |||
{ | |||
lfoS[0] = 0.5f; | |||
lfoS[1] = 0.0f; | |||
buffer.clear(); | |||
setSampleRate(44100.0f); | |||
} | |||
void updateParameterPtr(const float* const p) | |||
@@ -92,13 +93,9 @@ public: | |||
void processBlock(float* const outBufferL, float* const outBufferR, const int numSamples) | |||
{ | |||
#ifdef CARLA_EXPORT | |||
const float depth = parameters[0] * 0.2f; | |||
const float speed = parameters[1] * parameters[1]; | |||
#else | |||
const float depth = parameters[77] * 0.2f; | |||
const float speed = parameters[76] * parameters[76]; | |||
#endif | |||
const float depth = parameters[77] * 0.2f + 0.01f; | |||
const int delay = int(cycle * 0.5f); | |||
const float lfoC = 2.0f * sinf(float_Pi * (speed * 5.0f) / sampleRate); | |||
@@ -50,13 +50,15 @@ class VexDelay | |||
public: | |||
VexDelay(const float* const p) | |||
: parameters(p), | |||
sampleRate(44100), | |||
bufferSize(sampleRate*2), | |||
sampleRate(0.0f), | |||
bufferSize(0), | |||
iRead(0), | |||
iWrite(0), | |||
buffer(2, bufferSize) | |||
buffer(2, 0) | |||
{ | |||
buffer.clear(); | |||
setSampleRate(44100.0f); | |||
} | |||
void updateParameterPtr(const float* const p) | |||
@@ -88,13 +90,8 @@ public: | |||
{ | |||
bpm = jlimit(10.0, 500.0, bpm); | |||
#ifdef CARLA_EXPORT | |||
const int delay = jmin(int(parameters[0]) * int(((60.0 / bpm) * sampleRate) / 4.0), 44100); | |||
const float feedback = parameters[1]/100.0f; | |||
#else | |||
const int delay = jmin(int(parameters[73] * 8.0) * int(((60.0 / bpm) * sampleRate) / 4.0), 44100); | |||
const int delay = jmin(int(parameters[73] * 8.0f) * int(((60.0 / bpm) * sampleRate) / 4.0), 44100); | |||
const float feedback = parameters[74]; | |||
#endif | |||
float* const bufferL = buffer.getSampleData(0, 0); | |||
float* const bufferR = buffer.getSampleData(1, 0); | |||
@@ -69,15 +69,10 @@ public: | |||
void processBlock(float* const outBufferL, float* const outBufferR, const int numSamples) | |||
{ | |||
#ifdef CARLA_EXPORT | |||
model.setroomsize(parameters[0]); | |||
model.setdamp(parameters[1]); | |||
model.setwidth(parameters[2]); | |||
#else | |||
model.setroomsize(parameters[79]); | |||
model.setdamp(parameters[81]); | |||
model.setwidth(parameters[80]); | |||
#endif | |||
model.setdamp(parameters[81]); | |||
model.processreplace(outBufferL, outBufferR, outBufferL, outBufferR, numSamples, 1); | |||
} | |||
@@ -77,30 +77,22 @@ public: | |||
} | |||
} | |||
#ifdef CARLA_EXPORT | |||
void doProcess(float* const outPtrL, float* const outPtrR, const int numSamples) | |||
{ | |||
#else | |||
void doProcess(AudioSampleBuffer& assbf, AudioSampleBuffer& obf, AudioSampleBuffer& ebf1, AudioSampleBuffer& ebf2, AudioSampleBuffer& ebf3) | |||
void doProcess(AudioSampleBuffer& obf, AudioSampleBuffer& assbf, AudioSampleBuffer& ebf1, AudioSampleBuffer& ebf2, AudioSampleBuffer& ebf3) | |||
{ | |||
const int numSamples = obf.getNumSamples(); | |||
float* const outPtrL = assbf.getSampleData(0,0); | |||
float* const outPtrR = assbf.getSampleData(1,0); | |||
#endif | |||
if (part1) | |||
{ | |||
#ifndef CARLA_EXPORT | |||
float right = parameters[86] * parameters[83]; | |||
float left = parameters[86] * (1.0f - parameters[83]); | |||
#endif | |||
for (int i = 0; i < kNumVoices; ++i) | |||
{ | |||
if (vo1[i]->getIsOn()) | |||
{ | |||
vo1[i]->doProcess(outPtrL, outPtrR, numSamples); | |||
#ifndef CARLA_EXPORT | |||
obf.addFrom(0, 0, assbf, 0, 0, numSamples, left); | |||
obf.addFrom(1, 0, assbf, 1, 0, numSamples, right); | |||
ebf1.addFrom(0, 0, assbf, 0, 0, numSamples, parameters[22] * left); | |||
@@ -109,24 +101,20 @@ public: | |||
ebf2.addFrom(1, 0, assbf, 1, 0, numSamples, parameters[23] * right); | |||
ebf3.addFrom(0, 0, assbf, 0, 0, numSamples, parameters[24] * left); | |||
ebf3.addFrom(1, 0, assbf, 1, 0, numSamples, parameters[24] * right); | |||
#endif | |||
} | |||
} | |||
} | |||
if (part2) | |||
{ | |||
#ifndef CARLA_EXPORT | |||
float right = parameters[87] * parameters[84]; | |||
float left = parameters[87] * (1.0f - parameters[84]); | |||
#endif | |||
for (int i = 0; i < kNumVoices; ++i) | |||
{ | |||
if (vo2[i]->getIsOn()) | |||
{ | |||
vo2[i]->doProcess(outPtrL, outPtrR, numSamples); | |||
#ifndef CARLA_EXPORT | |||
obf.addFrom(0, 0, assbf, 0, 0, numSamples, left); | |||
obf.addFrom(1, 0, assbf, 1, 0, numSamples, right); | |||
ebf1.addFrom(0, 0, assbf, 0, 0, numSamples, parameters[22 + 24] * left); | |||
@@ -135,24 +123,20 @@ public: | |||
ebf2.addFrom(1, 0, assbf, 1, 0, numSamples, parameters[23 + 24] * right); | |||
ebf3.addFrom(0, 0, assbf, 0, 0, numSamples, parameters[24 + 24] * left); | |||
ebf3.addFrom(1, 0, assbf, 1, 0, numSamples, parameters[24 + 24] * right); | |||
#endif | |||
} | |||
} | |||
} | |||
if (part3) | |||
{ | |||
#ifndef CARLA_EXPORT | |||
float right = parameters[88] * parameters[85]; | |||
float left = parameters[88] * (1.0f - parameters[85]); | |||
#endif | |||
for (int i = 0; i < kNumVoices; ++i) | |||
{ | |||
if (vo3[i]->getIsOn()) | |||
{ | |||
vo3[i]->doProcess(outPtrL, outPtrR, numSamples); | |||
#ifndef CARLA_EXPORT | |||
obf.addFrom(0, 0, assbf, 0, 0, numSamples, left); | |||
obf.addFrom(1, 0, assbf, 1, 0, numSamples, right); | |||
ebf1.addFrom(0, 0, assbf, 0, 0, numSamples, parameters[22 + 48] * left); | |||
@@ -161,7 +145,6 @@ public: | |||
ebf2.addFrom(1, 0, assbf, 1, 0, numSamples, parameters[23 + 48] * right); | |||
ebf3.addFrom(0, 0, assbf, 0, 0, numSamples, parameters[24 + 48] * left); | |||
ebf3.addFrom(1, 0, assbf, 1, 0, numSamples, parameters[24 + 48] * right); | |||
#endif | |||
} | |||
} | |||
} | |||
@@ -169,7 +152,21 @@ public: | |||
void setSampleRate(const double s) | |||
{ | |||
if (sampleRate == s) | |||
return; | |||
sampleRate = s; | |||
for (int i = 0; i < kNumVoices; ++i) | |||
{ | |||
delete vo1[i]; | |||
delete vo2[i]; | |||
delete vo3[i]; | |||
vo1[i] = new VexVoice(parameters, 0, wr1); | |||
vo2[i] = new VexVoice(parameters, 24, wr2); | |||
vo3[i] = new VexVoice(parameters, 48, wr3); | |||
} | |||
} | |||
void updateParameterPtr(const float* const p) | |||
@@ -342,8 +339,6 @@ public: | |||
case 1: | |||
wr1.setWaveLater(waveName); | |||
kill(1); | |||
// REMOVE THIS | |||
wr1.actuallySetWave(); | |||
break; | |||
case 2: | |||
wr2.setWaveLater(waveName); | |||
@@ -61,6 +61,8 @@ | |||
#include "lilv/lilvmm.hpp" | |||
#include "sratom/sratom.h" | |||
#include "juce_core.h" | |||
// ----------------------------------------------------------------------- | |||
// Define namespaces and missing prefixes | |||