Add the polyphony parameter

This commit is contained in:
Jean Pierre Cimalando 2020-03-06 11:46:49 +01:00 committed by Paul Fd
parent d8b1a79fe7
commit aa9a5d26f4
6 changed files with 80 additions and 15 deletions

View file

@ -22,6 +22,10 @@ tresult PLUGIN_API SfizzVstControllerNoUi::initialize(FUnknown* context)
kParamVolumeRange.createParameter(
Steinberg::String("Volume"), pid++, Steinberg::String("dB"),
0, Vst::ParameterInfo::kCanAutomate, Vst::kRootUnitId));
parameters.addParameter(
kParamNumVoicesRange.createParameter(
Steinberg::String("Polyphony"), pid++, nullptr,
0, Vst::ParameterInfo::kNoFlags, Vst::kRootUnitId));
// MIDI controllers
for (unsigned i = 0; i < kNumControllerParams; ++i) {
@ -85,19 +89,35 @@ tresult PLUGIN_API SfizzVstController::setParamNormalized(Vst::ParamID tag, Vst:
if (r != kResultTrue)
return r;
float *slot = nullptr;
float *slotF32 = nullptr;
int32 *slotI32 = nullptr;
float value = 0;
switch (tag) {
case kPidVolume: {
slot = &_state.volume;
slotF32 = &_state.volume;
value = kParamVolumeRange.denormalize(normValue);
break;
}
case kPidNumVoices: {
slotI32 = &_state.numVoices;
value = kParamNumVoicesRange.denormalize(normValue);
break;
}
}
if (slot && *slot != value) {
*slot = value;
bool update = false;
if (slotF32 && *slotF32 != value) {
*slotF32 = value;
update = true;
}
else if (slotI32 && *slotI32 != (int32)value) {
*slotI32 = (int32)value;
update = true;
}
if (update) {
for (StateListener* listener : _stateListeners)
listener->onStateChanged();
}
@ -137,6 +157,7 @@ tresult PLUGIN_API SfizzVstController::setComponentState(IBStream* state)
_state = s;
setParamNormalized(kPidVolume, kParamVolumeRange.normalize(s.volume));
setParamNormalized(kPidNumVoices, kParamNumVoicesRange.normalize(s.numVoices));
for (StateListener* listener : _stateListeners)
listener->onStateChanged();

View file

@ -76,6 +76,11 @@ void SfizzVstEditor::valueChanged(CControl* ctl)
controller->performEdit(kPidVolume, valueNorm);
break;
case kTagSetNumVoices:
controller->setParamNormalized(kPidNumVoices, valueNorm);
controller->performEdit(kPidNumVoices, valueNorm);
break;
default:
if (tag >= kTagFirstChangePanel && tag <= kTagLastChangePanel)
setActivePanel(tag - kTagFirstChangePanel);
@ -90,6 +95,7 @@ void SfizzVstEditor::enterOrLeaveEdit(CControl* ctl, bool enter)
switch (tag) {
case kTagSetVolume: id = kPidVolume; break;
case kTagSetNumVoices: id = kPidNumVoices; break;
default: return;
}
@ -231,21 +237,23 @@ void SfizzVstEditor::createFrameContents()
label->setHoriAlign(kLeftText);
panel->addView(label);
slider = new SimpleSlider(rightSide(), this, kTagSetVolume);
adjustMinMaxToRangeParam(slider, kPidVolume);
panel->addView(slider);
adjustMinMaxToRangeParam(slider, kPidVolume);
_volumeSlider = slider;
// row.top += interRow;
// row.bottom += interRow;
row.top += interRow;
row.bottom += interRow;
// label = new CTextLabel(leftSide(), "Polyphony");
// 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, -1);
// panel->addView(slider);
label = new CTextLabel(leftSide(), "Polyphony");
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, kTagSetNumVoices);
panel->addView(slider);
adjustMinMaxToRangeParam(slider, kPidNumVoices);
_numVoicesSlider = slider;
// row.top += interRow;
// row.bottom += interRow;
@ -331,6 +339,8 @@ void SfizzVstEditor::updateStateDisplay()
_fileLabel->setText(("File: " + state.sfzFile).c_str());
if (_volumeSlider)
_volumeSlider->setValue(state.volume);
if (_numVoicesSlider)
_numVoicesSlider->setValue(state.numVoices);
setActivePanel(uiState.activePanel);
}

View file

@ -62,6 +62,7 @@ private:
enum {
kTagLoadSfzFile,
kTagSetVolume,
kTagSetNumVoices,
kTagFirstChangePanel,
kTagLastChangePanel = kTagFirstChangePanel + kNumPanels - 1,
};
@ -69,4 +70,5 @@ private:
CBitmap _logo;
CTextLabel* _fileLabel = nullptr;
CSliderBase *_volumeSlider = nullptr;
CSliderBase *_numVoicesSlider = nullptr;
};

View file

@ -80,6 +80,7 @@ void SfizzVstProcessor::syncStateToSynth()
synth->loadSfzFile(_state.sfzFile);
synth->setVolume(_state.volume);
synth->setNumVoices(_state.numVoices);
}
tresult PLUGIN_API SfizzVstProcessor::canProcessSampleSize(int32 symbolicSampleSize)
@ -173,6 +174,21 @@ void SfizzVstProcessor::processParameterChanges(Vst::IParameterChanges& pc)
if (pointCount > 0 && vq->getPoint(pointCount - 1, sampleOffset, value) == kResultTrue)
_state.volume = kParamVolumeRange.denormalize(value);
break;
case kPidNumVoices:
if (pointCount > 0 && vq->getPoint(pointCount - 1, sampleOffset, value) == kResultTrue) {
Vst::IMessage* msg = allocateMessage();
if (!msg)
break;
msg->setMessageID("SetNumVoices");
Vst::IAttributeList* attr = msg->getAttributes();
attr->setInt("NumVoices", kParamNumVoicesRange.denormalize(value));
if (!_fifoToWorker.push(msg)) {
msg->release();
break;
}
_semaToWorker.post();
}
break;
}
}
}
@ -296,6 +312,13 @@ void SfizzVstProcessor::doBackgroundWork()
_synth->loadSfzFile(_state.sfzFile);
}
}
else if (!std::strcmp(id, "SetNumVoices")) {
int64 value;
if (attr->getInt("NumVoices", value) == kResultTrue) {
_state.numVoices = value;
_synth->setNumVoices(value);
}
}
msg->release();
}

View file

@ -24,6 +24,9 @@ tresult SfizzVstState::load(IBStream* state)
if (!s.readFloat(volume))
return kResultFalse;
if (!s.readInt32(numVoices))
return kResultFalse;
return kResultTrue;
}
@ -40,6 +43,9 @@ tresult SfizzVstState::store(IBStream* state) const
if (!s.writeFloat(volume))
return kResultFalse;
if (!s.writeInt32(numVoices))
return kResultFalse;
return kResultTrue;
}

View file

@ -19,6 +19,7 @@ enum {
// parameters
enum {
kPidVolume,
kPidNumVoices,
kPidMidiCC0,
kPidMidiCCLast = kPidMidiCC0 + kNumControllerParams - 1,
kPidMidiAftertouch,
@ -30,6 +31,7 @@ class SfizzVstState {
public:
std::string sfzFile;
float volume = 0;
int numVoices = 64;
static constexpr uint64 currentStateVersion = 0;
@ -72,3 +74,4 @@ struct SfizzParameterRange {
};
static constexpr SfizzParameterRange kParamVolumeRange(0.0, -60.0, +6.0);
static constexpr SfizzParameterRange kParamNumVoicesRange(64.0, 1.0, 256.0);