Preload size and log2 oversampling

This commit is contained in:
Jean Pierre Cimalando 2020-03-06 13:15:32 +01:00 committed by Paul Fd
parent 26ba7f33b0
commit ca044d98c5
6 changed files with 83 additions and 48 deletions

View file

@ -30,6 +30,10 @@ tresult PLUGIN_API SfizzVstControllerNoUi::initialize(FUnknown* context)
kParamOversamplingRange.createParameter( kParamOversamplingRange.createParameter(
Steinberg::String("Oversampling"), pid++, nullptr, Steinberg::String("Oversampling"), pid++, nullptr,
0, Vst::ParameterInfo::kNoFlags, Vst::kRootUnitId)); 0, Vst::ParameterInfo::kNoFlags, Vst::kRootUnitId));
parameters.addParameter(
kParamPreloadSizeRange.createParameter(
Steinberg::String("Preload size"), pid++, nullptr,
0, Vst::ParameterInfo::kNoFlags, Vst::kRootUnitId));
// MIDI controllers // MIDI controllers
for (unsigned i = 0; i < kNumControllerParams; ++i) { for (unsigned i = 0; i < kNumControllerParams; ++i) {
@ -80,10 +84,9 @@ tresult PLUGIN_API SfizzVstControllerNoUi::getParamStringByValue(Vst::ParamID ta
switch (tag) { switch (tag) {
case kPidOversampling: case kPidOversampling:
{ {
int factor = SfizzMisc::adaptOversamplingFactor( int factorLog2 = kParamOversamplingRange.denormalize(valueNormalized);
kParamOversamplingRange.denormalize(valueNormalized));
Steinberg::String buf; Steinberg::String buf;
buf.printf("%dX", factor); buf.printf("%dX", 1 << factorLog2);
buf.copyTo(string); buf.copyTo(string);
return kResultTrue; return kResultTrue;
} }
@ -98,10 +101,14 @@ tresult PLUGIN_API SfizzVstControllerNoUi::getParamValueByString(Vst::ParamID ta
case kPidOversampling: case kPidOversampling:
{ {
int factor; int factor;
if (!Steinberg::String::scanInt32(string, factor, false)) if (!Steinberg::String::scanInt32(string, factor, false) || factor < 1)
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; return kResultTrue;
} }
} }
@ -143,10 +150,15 @@ tresult PLUGIN_API SfizzVstController::setParamNormalized(Vst::ParamID tag, Vst:
break; break;
} }
case kPidOversampling: { case kPidOversampling: {
slotI32 = &_state.oversampling; slotI32 = &_state.oversamplingLog2;
value = kParamOversamplingRange.denormalize(normValue); value = kParamOversamplingRange.denormalize(normValue);
break; break;
} }
case kPidPreloadSize: {
slotI32 = &_state.preloadSize;
value = kParamPreloadSizeRange.denormalize(normValue);
break;
}
} }
bool update = false; bool update = false;
@ -201,7 +213,8 @@ tresult PLUGIN_API SfizzVstController::setComponentState(IBStream* state)
setParamNormalized(kPidVolume, kParamVolumeRange.normalize(s.volume)); setParamNormalized(kPidVolume, kParamVolumeRange.normalize(s.volume));
setParamNormalized(kPidNumVoices, kParamNumVoicesRange.normalize(s.numVoices)); 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) for (StateListener* listener : _stateListeners)
listener->onStateChanged(); listener->onStateChanged();

View file

@ -86,6 +86,11 @@ void SfizzVstEditor::valueChanged(CControl* ctl)
controller->performEdit(kPidOversampling, valueNorm); controller->performEdit(kPidOversampling, valueNorm);
break; break;
case kTagSetPreloadSize:
controller->setParamNormalized(kPidPreloadSize, valueNorm);
controller->performEdit(kPidPreloadSize, valueNorm);
break;
default: default:
if (tag >= kTagFirstChangePanel && tag <= kTagLastChangePanel) if (tag >= kTagFirstChangePanel && tag <= kTagLastChangePanel)
setActivePanel(tag - kTagFirstChangePanel); setActivePanel(tag - kTagFirstChangePanel);
@ -102,6 +107,7 @@ void SfizzVstEditor::enterOrLeaveEdit(CControl* ctl, bool enter)
case kTagSetVolume: id = kPidVolume; break; case kTagSetVolume: id = kPidVolume; break;
case kTagSetNumVoices: id = kPidNumVoices; break; case kTagSetNumVoices: id = kPidNumVoices; break;
case kTagSetOversampling: id = kPidOversampling; break; case kTagSetOversampling: id = kPidOversampling; break;
case kTagSetPreloadSize: id = kPidPreloadSize; break;
default: return; default: return;
} }
@ -275,19 +281,19 @@ void SfizzVstEditor::createFrameContents()
adjustMinMaxToRangeParam(slider, kPidOversampling); adjustMinMaxToRangeParam(slider, kPidOversampling);
_oversamplingSlider = slider; _oversamplingSlider = slider;
// row.top += interRow; row.top += interRow;
// row.bottom += interRow; row.bottom += interRow;
// label = new CTextLabel(leftSide(), "Preload size"); label = new CTextLabel(leftSide(), "Preload size");
// label->setFontColor(CColor(0x00, 0x00, 0x00)); label->setFontColor(CColor(0x00, 0x00, 0x00));
// label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00));
// label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00));
// label->setHoriAlign(kLeftText); label->setHoriAlign(kLeftText);
// panel->addView(label); panel->addView(label);
// slider = new SimpleSlider(rightSide(), this, kTag); slider = new SimpleSlider(rightSide(), this, kTagSetPreloadSize);
// panel->addView(slider); panel->addView(slider);
// adjustMinMaxToRangeParam(slider, kPid); adjustMinMaxToRangeParam(slider, kPidPreloadSize);
// _aSlider = slider; _preloadSizeSlider = slider;
// row.top += interRow; // row.top += interRow;
// row.bottom += interRow; // row.bottom += interRow;
@ -354,7 +360,9 @@ void SfizzVstEditor::updateStateDisplay()
if (_numVoicesSlider) if (_numVoicesSlider)
_numVoicesSlider->setValue(state.numVoices); _numVoicesSlider->setValue(state.numVoices);
if (_oversamplingSlider) if (_oversamplingSlider)
_oversamplingSlider->setValue(state.oversampling); _oversamplingSlider->setValue(state.oversamplingLog2);
if (_preloadSizeSlider)
_preloadSizeSlider->setValue(state.preloadSize);
setActivePanel(uiState.activePanel); setActivePanel(uiState.activePanel);
} }

View file

@ -64,6 +64,7 @@ private:
kTagSetVolume, kTagSetVolume,
kTagSetNumVoices, kTagSetNumVoices,
kTagSetOversampling, kTagSetOversampling,
kTagSetPreloadSize,
kTagFirstChangePanel, kTagFirstChangePanel,
kTagLastChangePanel = kTagFirstChangePanel + kNumPanels - 1, kTagLastChangePanel = kTagFirstChangePanel + kNumPanels - 1,
}; };
@ -73,4 +74,5 @@ private:
CSliderBase *_volumeSlider = nullptr; CSliderBase *_volumeSlider = nullptr;
CSliderBase *_numVoicesSlider = nullptr; CSliderBase *_numVoicesSlider = nullptr;
CSliderBase *_oversamplingSlider = nullptr; CSliderBase *_oversamplingSlider = nullptr;
CSliderBase *_preloadSizeSlider = nullptr;
}; };

View file

@ -81,8 +81,8 @@ void SfizzVstProcessor::syncStateToSynth()
synth->loadSfzFile(_state.sfzFile); synth->loadSfzFile(_state.sfzFile);
synth->setVolume(_state.volume); synth->setVolume(_state.volume);
synth->setNumVoices(_state.numVoices); synth->setNumVoices(_state.numVoices);
synth->setOversamplingFactor( synth->setOversamplingFactor(1 << _state.oversamplingLog2);
SfizzMisc::adaptOversamplingFactor(_state.oversampling)); synth->setPreloadSize(_state.preloadSize);
} }
tresult PLUGIN_API SfizzVstProcessor::canProcessSampleSize(int32 symbolicSampleSize) tresult PLUGIN_API SfizzVstProcessor::canProcessSampleSize(int32 symbolicSampleSize)
@ -206,6 +206,21 @@ void SfizzVstProcessor::processParameterChanges(Vst::IParameterChanges& pc)
_semaToWorker.post(); _semaToWorker.post();
} }
break; 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")) { else if (!std::strcmp(id, "SetOversampling")) {
int64 value; int64 value;
if (attr->getInt("Oversampling", value) == kResultTrue) { if (attr->getInt("Oversampling", value) == kResultTrue) {
_state.oversampling = value; _state.oversamplingLog2 = value;
_synth->setOversamplingFactor( _synth->setOversamplingFactor(1 << value);
SfizzMisc::adaptOversamplingFactor(value)); }
}
else if (!std::strcmp(id, "SetPreloadSize")) {
int64 value;
if (attr->getInt("PreloadSize", value) == kResultTrue) {
_state.preloadSize = value;
_synth->setPreloadSize(value);
} }
} }

View file

@ -28,7 +28,10 @@ tresult SfizzVstState::load(IBStream* state)
if (!s.readInt32(numVoices)) if (!s.readInt32(numVoices))
return kResultFalse; return kResultFalse;
if (!s.readInt32(oversampling)) if (!s.readInt32(oversamplingLog2))
return kResultFalse;
if (!s.readInt32(preloadSize))
return kResultFalse; return kResultFalse;
return kResultTrue; return kResultTrue;
@ -50,7 +53,10 @@ tresult SfizzVstState::store(IBStream* state) const
if (!s.writeInt32(numVoices)) if (!s.writeInt32(numVoices))
return kResultFalse; return kResultFalse;
if (!s.writeInt32(oversampling)) if (!s.writeInt32(oversamplingLog2))
return kResultFalse;
if (!s.writeInt32(preloadSize))
return kResultFalse; return kResultFalse;
return kResultTrue; return kResultTrue;
@ -82,16 +88,3 @@ tresult SfizzUiState::store(IBStream* state) const
return kResultTrue; 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;
}

View file

@ -21,6 +21,7 @@ enum {
kPidVolume, kPidVolume,
kPidNumVoices, kPidNumVoices,
kPidOversampling, kPidOversampling,
kPidPreloadSize,
kPidMidiCC0, kPidMidiCC0,
kPidMidiCCLast = kPidMidiCC0 + kNumControllerParams - 1, kPidMidiCCLast = kPidMidiCC0 + kNumControllerParams - 1,
kPidMidiAftertouch, kPidMidiAftertouch,
@ -33,7 +34,8 @@ public:
std::string sfzFile; std::string sfzFile;
float volume = 0; float volume = 0;
int numVoices = 64; int numVoices = 64;
int oversampling = 1; int oversamplingLog2 = 0;
int preloadSize = 8192;
static constexpr uint64 currentStateVersion = 0; static constexpr uint64 currentStateVersion = 0;
@ -77,9 +79,5 @@ struct SfizzParameterRange {
static constexpr SfizzParameterRange kParamVolumeRange(0.0, -60.0, +6.0); static constexpr SfizzParameterRange kParamVolumeRange(0.0, -60.0, +6.0);
static constexpr SfizzParameterRange kParamNumVoicesRange(64.0, 1.0, 256.0); static constexpr SfizzParameterRange kParamNumVoicesRange(64.0, 1.0, 256.0);
static constexpr SfizzParameterRange kParamOversamplingRange(1.0, 1.0, 8.0); static constexpr SfizzParameterRange kParamOversamplingRange(0.0, 0.0, 3.0);
static constexpr SfizzParameterRange kParamPreloadSizeRange(8192.0, 1024.0, 65536.0);
class SfizzMisc {
public:
static int adaptOversamplingFactor(int factor);
};