Preload size and log2 oversampling
This commit is contained in:
parent
26ba7f33b0
commit
ca044d98c5
6 changed files with 83 additions and 48 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue