in pedalboard/juce_overrides/juce_PatchedVST3PluginFormat.cpp [3100:3176]
void refreshParameterList() override {
AudioProcessorParameterGroup newParameterTree;
// We're going to add parameter groups to the tree recursively in the same
// order as the first parameters contained within them.
std::map<Vst::UnitID, Vst::UnitInfo> infoMap;
std::map<Vst::UnitID, AudioProcessorParameterGroup *> groupMap;
groupMap[Vst::kRootUnitId] = &newParameterTree;
if (unitInfo != nullptr) {
const auto numUnits = unitInfo->getUnitCount();
for (int i = 1; i < numUnits; ++i) {
Vst::UnitInfo ui{};
unitInfo->getUnitInfo(i, ui);
infoMap[ui.id] = std::move(ui);
}
}
{
auto allIds = getAllParamIDs(*editController);
inputParameterChanges->initialise(allIds);
outputParameterChanges->initialise(allIds);
cachedParamValues = CachedParamValues{std::move(allIds)};
}
for (int i = 0; i < editController->getParameterCount(); ++i) {
auto paramInfo = getParameterInfoForIndex(i);
auto *param = new VST3Parameter(
*this, i, paramInfo.id,
(paramInfo.flags & Vst::ParameterInfo::kCanAutomate) != 0);
if ((paramInfo.flags & Vst::ParameterInfo::kIsBypass) != 0)
bypassParam = param;
std::function<AudioProcessorParameterGroup *(Vst::UnitID)>
findOrCreateGroup;
findOrCreateGroup = [&groupMap, &infoMap,
&findOrCreateGroup](Vst::UnitID groupID) {
auto existingGroup = groupMap.find(groupID);
if (existingGroup != groupMap.end())
return existingGroup->second;
auto groupInfo = infoMap.find(groupID);
if (groupInfo == infoMap.end())
return groupMap[Vst::kRootUnitId];
auto *group = new AudioProcessorParameterGroup(
String(groupInfo->first), toString(groupInfo->second.name), {});
groupMap[groupInfo->first] = group;
auto *parentGroup = findOrCreateGroup(groupInfo->second.parentUnitId);
parentGroup->addChild(
std::unique_ptr<AudioProcessorParameterGroup>(group));
return group;
};
auto *group = findOrCreateGroup(paramInfo.unitId);
group->addChild(std::unique_ptr<AudioProcessorParameter>(param));
}
setHostedParameterTree(std::move(newParameterTree));
idToParamMap = [this] {
std::map<Vst::ParamID, VST3Parameter *> result;
for (auto *parameter : getParameters()) {
auto *vst3Param = static_cast<VST3Parameter *>(parameter);
result.emplace(vst3Param->getParamID(), vst3Param);
}
return result;
}();
}