From ca044d98c50952ad945fa29cdd2f2b029d24c0a1 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Fri, 6 Mar 2020 13:15:32 +0100 Subject: [PATCH] Preload size and log2 oversampling --- vst/SfizzVstController.cpp | 29 +++++++++++++++++++++-------- vst/SfizzVstEditor.cpp | 34 +++++++++++++++++++++------------- vst/SfizzVstEditor.h | 2 ++ vst/SfizzVstProcessor.cpp | 31 ++++++++++++++++++++++++++----- vst/SfizzVstState.cpp | 23 ++++++++--------------- vst/SfizzVstState.h | 12 +++++------- 6 files changed, 83 insertions(+), 48 deletions(-) diff --git a/vst/SfizzVstController.cpp b/vst/SfizzVstController.cpp index 065c41fa..984a2521 100644 --- a/vst/SfizzVstController.cpp +++ b/vst/SfizzVstController.cpp @@ -30,6 +30,10 @@ tresult PLUGIN_API SfizzVstControllerNoUi::initialize(FUnknown* context) kParamOversamplingRange.createParameter( Steinberg::String("Oversampling"), pid++, nullptr, 0, Vst::ParameterInfo::kNoFlags, Vst::kRootUnitId)); + parameters.addParameter( + kParamPreloadSizeRange.createParameter( + Steinberg::String("Preload size"), pid++, nullptr, + 0, Vst::ParameterInfo::kNoFlags, Vst::kRootUnitId)); // MIDI controllers for (unsigned i = 0; i < kNumControllerParams; ++i) { @@ -80,10 +84,9 @@ tresult PLUGIN_API SfizzVstControllerNoUi::getParamStringByValue(Vst::ParamID ta switch (tag) { case kPidOversampling: { - int factor = SfizzMisc::adaptOversamplingFactor( - kParamOversamplingRange.denormalize(valueNormalized)); + int factorLog2 = kParamOversamplingRange.denormalize(valueNormalized); Steinberg::String buf; - buf.printf("%dX", factor); + buf.printf("%dX", 1 << factorLog2); buf.copyTo(string); return kResultTrue; } @@ -98,10 +101,14 @@ tresult PLUGIN_API SfizzVstControllerNoUi::getParamValueByString(Vst::ParamID ta case kPidOversampling: { int factor; - if (!Steinberg::String::scanInt32(string, factor, false)) + if (!Steinberg::String::scanInt32(string, factor, false) || factor < 1) factor = 1; - valueNormalized = kParamOversamplingRange.normalize( - SfizzMisc::adaptOversamplingFactor(factor)); + + int log2Factor = 0; + for (int f = factor; f > 1; f /= 2) + ++log2Factor; + + valueNormalized = kParamOversamplingRange.normalize(log2Factor); return kResultTrue; } } @@ -143,10 +150,15 @@ tresult PLUGIN_API SfizzVstController::setParamNormalized(Vst::ParamID tag, Vst: break; } case kPidOversampling: { - slotI32 = &_state.oversampling; + slotI32 = &_state.oversamplingLog2; value = kParamOversamplingRange.denormalize(normValue); break; } + case kPidPreloadSize: { + slotI32 = &_state.preloadSize; + value = kParamPreloadSizeRange.denormalize(normValue); + break; + } } bool update = false; @@ -201,7 +213,8 @@ tresult PLUGIN_API SfizzVstController::setComponentState(IBStream* state) setParamNormalized(kPidVolume, kParamVolumeRange.normalize(s.volume)); setParamNormalized(kPidNumVoices, kParamNumVoicesRange.normalize(s.numVoices)); - setParamNormalized(kPidOversampling, kParamOversamplingRange.normalize(s.oversampling)); + setParamNormalized(kPidOversampling, kParamOversamplingRange.normalize(s.oversamplingLog2)); + setParamNormalized(kPidPreloadSize, kParamPreloadSizeRange.normalize(s.preloadSize)); for (StateListener* listener : _stateListeners) listener->onStateChanged(); diff --git a/vst/SfizzVstEditor.cpp b/vst/SfizzVstEditor.cpp index 65da051a..422c1b01 100644 --- a/vst/SfizzVstEditor.cpp +++ b/vst/SfizzVstEditor.cpp @@ -86,6 +86,11 @@ void SfizzVstEditor::valueChanged(CControl* ctl) controller->performEdit(kPidOversampling, valueNorm); break; + case kTagSetPreloadSize: + controller->setParamNormalized(kPidPreloadSize, valueNorm); + controller->performEdit(kPidPreloadSize, valueNorm); + break; + default: if (tag >= kTagFirstChangePanel && tag <= kTagLastChangePanel) setActivePanel(tag - kTagFirstChangePanel); @@ -102,6 +107,7 @@ void SfizzVstEditor::enterOrLeaveEdit(CControl* ctl, bool enter) case kTagSetVolume: id = kPidVolume; break; case kTagSetNumVoices: id = kPidNumVoices; break; case kTagSetOversampling: id = kPidOversampling; break; + case kTagSetPreloadSize: id = kPidPreloadSize; break; default: return; } @@ -275,19 +281,19 @@ void SfizzVstEditor::createFrameContents() adjustMinMaxToRangeParam(slider, kPidOversampling); _oversamplingSlider = slider; - // row.top += interRow; - // row.bottom += interRow; + row.top += interRow; + row.bottom += interRow; - // label = new CTextLabel(leftSide(), "Preload size"); - // label->setFontColor(CColor(0x00, 0x00, 0x00)); - // label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - // label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - // label->setHoriAlign(kLeftText); - // panel->addView(label); - // slider = new SimpleSlider(rightSide(), this, kTag); - // panel->addView(slider); - // adjustMinMaxToRangeParam(slider, kPid); - // _aSlider = slider; + label = new CTextLabel(leftSide(), "Preload size"); + label->setFontColor(CColor(0x00, 0x00, 0x00)); + label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); + label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); + label->setHoriAlign(kLeftText); + panel->addView(label); + slider = new SimpleSlider(rightSide(), this, kTagSetPreloadSize); + panel->addView(slider); + adjustMinMaxToRangeParam(slider, kPidPreloadSize); + _preloadSizeSlider = slider; // row.top += interRow; // row.bottom += interRow; @@ -354,7 +360,9 @@ void SfizzVstEditor::updateStateDisplay() if (_numVoicesSlider) _numVoicesSlider->setValue(state.numVoices); if (_oversamplingSlider) - _oversamplingSlider->setValue(state.oversampling); + _oversamplingSlider->setValue(state.oversamplingLog2); + if (_preloadSizeSlider) + _preloadSizeSlider->setValue(state.preloadSize); setActivePanel(uiState.activePanel); } diff --git a/vst/SfizzVstEditor.h b/vst/SfizzVstEditor.h index 353db127..7ed9a4dd 100644 --- a/vst/SfizzVstEditor.h +++ b/vst/SfizzVstEditor.h @@ -64,6 +64,7 @@ private: kTagSetVolume, kTagSetNumVoices, kTagSetOversampling, + kTagSetPreloadSize, kTagFirstChangePanel, kTagLastChangePanel = kTagFirstChangePanel + kNumPanels - 1, }; @@ -73,4 +74,5 @@ private: CSliderBase *_volumeSlider = nullptr; CSliderBase *_numVoicesSlider = nullptr; CSliderBase *_oversamplingSlider = nullptr; + CSliderBase *_preloadSizeSlider = nullptr; }; diff --git a/vst/SfizzVstProcessor.cpp b/vst/SfizzVstProcessor.cpp index b7111dce..3380fbb3 100644 --- a/vst/SfizzVstProcessor.cpp +++ b/vst/SfizzVstProcessor.cpp @@ -81,8 +81,8 @@ void SfizzVstProcessor::syncStateToSynth() synth->loadSfzFile(_state.sfzFile); synth->setVolume(_state.volume); synth->setNumVoices(_state.numVoices); - synth->setOversamplingFactor( - SfizzMisc::adaptOversamplingFactor(_state.oversampling)); + synth->setOversamplingFactor(1 << _state.oversamplingLog2); + synth->setPreloadSize(_state.preloadSize); } tresult PLUGIN_API SfizzVstProcessor::canProcessSampleSize(int32 symbolicSampleSize) @@ -206,6 +206,21 @@ void SfizzVstProcessor::processParameterChanges(Vst::IParameterChanges& pc) _semaToWorker.post(); } break; + case kPidPreloadSize: + if (pointCount > 0 && vq->getPoint(pointCount - 1, sampleOffset, value) == kResultTrue) { + Vst::IMessage* msg = allocateMessage(); + if (!msg) + break; + msg->setMessageID("SetPreloadSize"); + Vst::IAttributeList* attr = msg->getAttributes(); + attr->setInt("PreloadSize", kParamPreloadSizeRange.denormalize(value)); + if (!_fifoToWorker.push(msg)) { + msg->release(); + break; + } + _semaToWorker.post(); + } + break; } } } @@ -339,9 +354,15 @@ void SfizzVstProcessor::doBackgroundWork() else if (!std::strcmp(id, "SetOversampling")) { int64 value; if (attr->getInt("Oversampling", value) == kResultTrue) { - _state.oversampling = value; - _synth->setOversamplingFactor( - SfizzMisc::adaptOversamplingFactor(value)); + _state.oversamplingLog2 = value; + _synth->setOversamplingFactor(1 << value); + } + } + else if (!std::strcmp(id, "SetPreloadSize")) { + int64 value; + if (attr->getInt("PreloadSize", value) == kResultTrue) { + _state.preloadSize = value; + _synth->setPreloadSize(value); } } diff --git a/vst/SfizzVstState.cpp b/vst/SfizzVstState.cpp index 0b416c3d..17240921 100644 --- a/vst/SfizzVstState.cpp +++ b/vst/SfizzVstState.cpp @@ -28,7 +28,10 @@ tresult SfizzVstState::load(IBStream* state) if (!s.readInt32(numVoices)) return kResultFalse; - if (!s.readInt32(oversampling)) + if (!s.readInt32(oversamplingLog2)) + return kResultFalse; + + if (!s.readInt32(preloadSize)) return kResultFalse; return kResultTrue; @@ -50,7 +53,10 @@ tresult SfizzVstState::store(IBStream* state) const if (!s.writeInt32(numVoices)) return kResultFalse; - if (!s.writeInt32(oversampling)) + if (!s.writeInt32(oversamplingLog2)) + return kResultFalse; + + if (!s.writeInt32(preloadSize)) return kResultFalse; return kResultTrue; @@ -82,16 +88,3 @@ tresult SfizzUiState::store(IBStream* state) const return kResultTrue; } - -/// -int SfizzMisc::adaptOversamplingFactor(int valueDenorm) -{ - if (valueDenorm >= 8) - return SFIZZ_OVERSAMPLING_X8; - else if (valueDenorm >= 4) - return SFIZZ_OVERSAMPLING_X4; - else if (valueDenorm >= 2) - return SFIZZ_OVERSAMPLING_X2; - else - return SFIZZ_OVERSAMPLING_X1; -} diff --git a/vst/SfizzVstState.h b/vst/SfizzVstState.h index 6bc6dbe5..f42817b3 100644 --- a/vst/SfizzVstState.h +++ b/vst/SfizzVstState.h @@ -21,6 +21,7 @@ enum { kPidVolume, kPidNumVoices, kPidOversampling, + kPidPreloadSize, kPidMidiCC0, kPidMidiCCLast = kPidMidiCC0 + kNumControllerParams - 1, kPidMidiAftertouch, @@ -33,7 +34,8 @@ public: std::string sfzFile; float volume = 0; int numVoices = 64; - int oversampling = 1; + int oversamplingLog2 = 0; + int preloadSize = 8192; static constexpr uint64 currentStateVersion = 0; @@ -77,9 +79,5 @@ struct SfizzParameterRange { static constexpr SfizzParameterRange kParamVolumeRange(0.0, -60.0, +6.0); static constexpr SfizzParameterRange kParamNumVoicesRange(64.0, 1.0, 256.0); -static constexpr SfizzParameterRange kParamOversamplingRange(1.0, 1.0, 8.0); - -class SfizzMisc { -public: - static int adaptOversamplingFactor(int factor); -}; +static constexpr SfizzParameterRange kParamOversamplingRange(0.0, 0.0, 3.0); +static constexpr SfizzParameterRange kParamPreloadSizeRange(8192.0, 1024.0, 65536.0);