From 911e43205add7efbcac260ec8189b635bc66ebf9 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Sat, 1 May 2021 21:50:47 +0200 Subject: [PATCH] Implement pitch names for VST3 --- plugins/vst/SfizzVstController.cpp | 50 ++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/plugins/vst/SfizzVstController.cpp b/plugins/vst/SfizzVstController.cpp index 7e17b1d9..9b5458d9 100644 --- a/plugins/vst/SfizzVstController.cpp +++ b/plugins/vst/SfizzVstController.cpp @@ -8,11 +8,16 @@ #include "SfizzVstEditor.h" #include "SfizzVstParameters.h" #include "SfizzVstIDs.h" +#include "plugin/InstrumentDescription.h" #include "base/source/fstreamer.h" #include "base/source/updatehandler.h" +#include +#include #include #include +enum { kProgramListID = 0 }; + tresult PLUGIN_API SfizzVstControllerNoUi::initialize(FUnknown* context) { tresult result = EditControllerEx1::initialize(context); @@ -32,6 +37,9 @@ tresult PLUGIN_API SfizzVstControllerNoUi::initialize(FUnknown* context) scalaUpdate_ = Steinberg::owned(new ScalaUpdate); playStateUpdate_ = Steinberg::owned(new PlayStateUpdate); + // Unit + addUnit(new Vst::Unit(Steinberg::String("Root"), Vst::kRootUnitId, Vst::kNoParentUnitId, kProgramListID)); + // Parameters Vst::ParamID pid = 0; @@ -130,6 +138,13 @@ tresult PLUGIN_API SfizzVstControllerNoUi::initialize(FUnknown* context) midiMapping_[i] = id; } + // Program list + IPtr list = Steinberg::owned( + new Vst::ProgramListWithPitchNames(Steinberg::String("Programs"), kProgramListID, Vst::kRootUnitId)); + list->addProgram(Steinberg::String("Default")); + addProgramList(list); + list->addRef(); + return kResultTrue; } @@ -247,6 +262,18 @@ tresult SfizzVstControllerNoUi::notify(Vst::IMessage* message) assert(false); return kResultFalse; } + + // update the program name and notify + std::string name = fs::u8path(sfzUpdate_->getPath()).filename().u8string(); + if (absl::EndsWithIgnoreCase(name, ".sfz")) + name.resize(name.size() - 4); + setProgramName(kProgramListID, 0, Steinberg::String(name.c_str())); + + FUnknownPtr unitHandler(getComponentHandler()); + if (unitHandler) + unitHandler->notifyProgramListChange(kProgramListID, 0); + + // sfzUpdate_->deferUpdate(); } else if (!strcmp(id, SfzDescriptionUpdate::getFClassID())) { @@ -254,6 +281,29 @@ tresult SfizzVstControllerNoUi::notify(Vst::IMessage* message) assert(false); return kResultFalse; } + + // parse the description blob + const InstrumentDescription desc = parseDescriptionBlob( + sfzDescriptionUpdate_->getDescription()); + + // update pitch names and notify + Vst::ProgramListWithPitchNames* list = + static_cast(getProgramList(kProgramListID)); + for (int16 pitch = 0; pitch < 128; ++pitch) { + Steinberg::String pitchName; + if (!desc.keyLabel[pitch].empty()) + pitchName = Steinberg::String(desc.keyLabel[pitch].c_str()); + else if (!desc.keyswitchLabel[pitch].empty()) + pitchName = Steinberg::String(desc.keyswitchLabel[pitch].c_str()); + + list->setPitchName(0, pitch, pitchName); + } + + FUnknownPtr unitHandler(getComponentHandler()); + if (unitHandler) + unitHandler->notifyProgramListChange(kProgramListID, 0); + + // sfzDescriptionUpdate_->deferUpdate(); } else if (!strcmp(id, ScalaUpdate::getFClassID())) {