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

View file

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

View file

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

View file

@ -80,6 +80,7 @@ void SfizzVstProcessor::syncStateToSynth()
synth->loadSfzFile(_state.sfzFile); synth->loadSfzFile(_state.sfzFile);
synth->setVolume(_state.volume); synth->setVolume(_state.volume);
synth->setNumVoices(_state.numVoices);
} }
tresult PLUGIN_API SfizzVstProcessor::canProcessSampleSize(int32 symbolicSampleSize) 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) if (pointCount > 0 && vq->getPoint(pointCount - 1, sampleOffset, value) == kResultTrue)
_state.volume = kParamVolumeRange.denormalize(value); _state.volume = kParamVolumeRange.denormalize(value);
break; 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); _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(); msg->release();
} }

View file

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

View file

@ -19,6 +19,7 @@ enum {
// parameters // parameters
enum { enum {
kPidVolume, kPidVolume,
kPidNumVoices,
kPidMidiCC0, kPidMidiCC0,
kPidMidiCCLast = kPidMidiCC0 + kNumControllerParams - 1, kPidMidiCCLast = kPidMidiCC0 + kNumControllerParams - 1,
kPidMidiAftertouch, kPidMidiAftertouch,
@ -30,6 +31,7 @@ class SfizzVstState {
public: public:
std::string sfzFile; std::string sfzFile;
float volume = 0; float volume = 0;
int numVoices = 64;
static constexpr uint64 currentStateVersion = 0; static constexpr uint64 currentStateVersion = 0;
@ -72,3 +74,4 @@ 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);