Add the polyphony parameter
This commit is contained in:
parent
d8b1a79fe7
commit
aa9a5d26f4
6 changed files with 80 additions and 15 deletions
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue