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(
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();

View file

@ -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);
}

View file

@ -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;
};

View file

@ -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);
}
}

View file

@ -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;
}

View file

@ -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);