13#include "pluginterfaces/base/ibstream.h"
14#include "public.sdk/source/vst/vsteditcontroller.h"
15#include "pluginterfaces/vst/ivstchannelcontextinfo.h"
18#include "IPlugVST3_Parameter.h"
19#include "IPlugVST3_Defs.h"
35 void Initialize(
IPlugAPIBase* pPlug,
bool plugIsInstrument,
bool midiIn)
37 Steinberg::Vst::EditControllerEx1* pEditController =
dynamic_cast<Steinberg::Vst::EditControllerEx1*
>(pPlug);
39 Steinberg::Vst::UnitInfo unitInfo;
40 unitInfo.id = Steinberg::Vst::kRootUnitId;
41 unitInfo.parentUnitId = Steinberg::Vst::kNoParentUnitId;
42 Steinberg::UString unitNameSetter(unitInfo.name, 128);
43 unitNameSetter.fromAscii(
"Root");
45 Steinberg::Vst::UnitID unitID = Steinberg::Vst::kRootUnitId;
47 #ifdef VST3_PRESET_LIST
50 unitInfo.programListId = kPresetParam;
53 Steinberg::Vst::ProgramListWithPitchNames* pList =
new Steinberg::Vst::ProgramListWithPitchNames(STR16(
"Factory Presets"), 0 , Steinberg::Vst::kRootUnitId);
55 Steinberg::Vst::String128 programName;
56 Steinberg::Vst::String128 pitchName;
58 for (
int programIdx=0; programIdx<pPlug->
NPresets(); programIdx++)
60 Steinberg::UString(programName, str16BufferSize(Steinberg::Vst::String128)).assign(pPlug->
GetPresetName(programIdx));
61 pList->addProgram (programName);
64 for (
int pitch = 0; pitch < 128; pitch++)
66 char pNoteText[32] =
"";
69 Steinberg::UString(pitchName, str16BufferSize(Steinberg::Vst::String128)).assign(pNoteText);
70 pList->setPitchName(programIdx, pitch, pitchName);
75 pEditController->addProgramList(pList);
79 unitInfo.programListId = Steinberg::Vst::kNoProgramListId;
81 if (!plugIsInstrument)
84 pEditController->addUnit(
new Steinberg::Vst::Unit(unitInfo));
86 for (
int i = 0; i < pPlug->NParams(); i++)
88 IParam* pParam = pPlug->GetParam(i);
89 unitID = Steinberg::Vst::kRootUnitId;
91 const char* paramGroupName = pParam->
GetGroup();
93 if (CStringHasContents(paramGroupName))
103 if (unitID == Steinberg::Vst::kRootUnitId)
106 unitInfo.id = unitID;
107 unitInfo.parentUnitId = Steinberg::Vst::kRootUnitId;
108 unitInfo.programListId = Steinberg::Vst::kNoProgramListId;
109 unitNameSetter.fromAscii(paramGroupName);
110 pEditController->addUnit (
new Steinberg::Vst::Unit (unitInfo));
114 Steinberg::Vst::Parameter* pVST3Parameter =
new IPlugVST3Parameter(pParam, i, unitID);
115 mParameters.addParameter(pVST3Parameter);
118 assert(VST3_NUM_CC_CHANS <= VST3_NUM_MIDI_IN_CHANS &&
"VST3_NUM_CC_CHANS must be less than or equal to VST3_NUM_MIDI_IN_CHANS");
120#if VST3_NUM_CC_CHANS > 0
123 unitInfo.id = unitID = pEditController->getUnitCount() + 1;
124 unitInfo.parentUnitId = Steinberg::Vst::kRootUnitId;
125 unitInfo.programListId = Steinberg::Vst::kNoProgramListId;
126 unitNameSetter.fromAscii(VST3_CC_UNITNAME);
127 pEditController->addUnit(
new Steinberg::Vst::Unit(unitInfo));
129 Steinberg::Vst::ParamID paramIdx = kMIDICCParamStartIdx;
131 WDL_String chanGroupStr;
132 Steinberg::Vst::UnitID midiCCsUnitID = unitID;
134 for (
int chan = 0; chan < VST3_NUM_CC_CHANS; chan++)
136 chanGroupStr.SetFormatted(32,
"CH%i", chan + 1);
138 unitInfo.id = unitID = pEditController->getUnitCount() + 1;
139 unitInfo.parentUnitId = midiCCsUnitID;
140 unitInfo.programListId = Steinberg::Vst::kNoProgramListId;
141 unitNameSetter.fromAscii(chanGroupStr.Get());
142 pEditController->addUnit(
new Steinberg::Vst::Unit(unitInfo));
144 Steinberg::Vst::String128 paramName;
145 for (
int i = 0; i < 128; i++)
147 Steinberg::UString(paramName, str16BufferSize(Steinberg::Vst::String128)).assign(
IMidiMsg::CCNameStr(i));
148 mParameters.addParameter(paramName, STR16(
""), 0, 0, 0, paramIdx++, unitID);
151 mParameters.addParameter(STR16(
"Channel Aftertouch"), STR16(
""), 0, 0, 0, paramIdx++, unitID);
152 mParameters.addParameter(STR16(
"Pitch Bend"), STR16(
""), 0, 0.5, 0, paramIdx++, unitID);
158 Steinberg::tresult PLUGIN_API GetProgramName(
IPlugAPIBase* pPlug, Steinberg::Vst::ProgramListID listId, Steinberg::int32 programIndex, Steinberg::Vst::String128 name)
160 if (pPlug->
NPresets() && listId == kPresetParam)
162 Steinberg::UString(name, 128).fromAscii(pPlug->
GetPresetName(programIndex));
163 return Steinberg::kResultTrue;
166 return Steinberg::kResultFalse;
169 Steinberg::int32 PLUGIN_API GetProgramListCount(
IPlugAPIBase* pPlug)
171#ifdef VST3_PRESET_LIST
178 Steinberg::tresult PLUGIN_API GetProgramListInfo(
IPlugAPIBase* pPlug, Steinberg::int32 listIndex, Steinberg::Vst::ProgramListInfo& info)
180#ifdef VST3_PRESET_LIST
181 if (listIndex == 0 && pPlug->
NPresets() > 0)
183 info.id = kPresetParam;
184 info.programCount = (Steinberg::int32) pPlug->
NPresets();
185 Steinberg::UString name(info.name, 128);
186 name.fromAscii(
"Factory Presets");
187 return Steinberg::kResultTrue;
191 return Steinberg::kResultFalse;
194 Steinberg::Vst::ParamValue GetParamNormalized(Steinberg::Vst::ParamID tag)
196 Steinberg::Vst::Parameter* parameter = mParameters.getParameter(tag);
197 return parameter ? parameter->getNormalized() : 0.0;
200 bool SetParamNormalized(
IPlugAPIBase* pPlug, Steinberg::Vst::ParamID tag, Steinberg::Vst::ParamValue value)
202 if (!SetVST3ParamNormalized(tag, value))
205 if (tag >= kBypassParam)
220 IParam* pParam = pPlug->GetParam(tag);
225 pPlug->OnParamChangeUI(tag, kHost);
226 pPlug->SendParameterValueFromDelegate(tag, value,
true);
233 bool SetChannelContextInfos(Steinberg::Vst::IAttributeList* pList)
235 using namespace Steinberg;
242 if (pList->getInt(ChannelContext::kChannelNameLengthKey, length) == kResultTrue)
248 std::vector<TChar> name((length+1)*2);
249 if (pList->getString(ChannelContext::kChannelNameKey, name.data(),
static_cast<Steinberg::uint32
>(length+1)*
sizeof(TChar)) == kResultTrue)
251 Steinberg::String str(name.data());
252 str.toMultiByte(kCP_Utf8);
253 mChannelName.Set(str);
258 if (pList->getInt(ChannelContext::kChannelUIDLengthKey, length) == kResultTrue)
264 std::vector<TChar> name((length+1)*2);
265 if (pList->getString(ChannelContext::kChannelUIDKey, name.data(),
static_cast<Steinberg::uint32
>(length+1)*
sizeof(TChar)) == kResultTrue)
267 Steinberg::String str(name.data());
268 str.toMultiByte(kCP_Utf8);
269 mChannelUID.Set(str);
275 if (pList->getInt(ChannelContext::kChannelIndexKey, index) == kResultTrue)
277 mChannelIndex =
static_cast<int>(index);
282 if (pList->getInt(ChannelContext::kChannelColorKey, color) == kResultTrue)
284 mChannelColor = (uint32) color;
288 if (pList->getInt(ChannelContext::kChannelIndexNamespaceOrderKey, index) == kResultTrue)
290 mChannelNamespaceIndex =
static_cast<int>(index);
294 if (pList->getInt(ChannelContext::kChannelIndexNamespaceLengthKey, length) == kResultTrue)
300 std::vector<TChar> name((length+1)*2);
301 if (pList->getString(ChannelContext::kChannelIndexNamespaceKey, name.data(),
static_cast<Steinberg::uint32
>(length+1)*
sizeof(TChar)) == kResultTrue)
303 Steinberg::String str(name.data());
304 str.toMultiByte(kCP_Utf8);
305 mChannelNamespace.Set(str);
311 if (pList->getInt(ChannelContext::kChannelPluginLocationKey, location) == kResultTrue)
316 case ChannelContext::kPreVolumeFader:
317 Steinberg::UString(string128, 128).fromAscii(
"PreVolFader");
319 case ChannelContext::kPostVolumeFader:
320 Steinberg::UString(string128, 128).fromAscii(
"PostVolFader");
322 case ChannelContext::kUsedAsPanner:
323 Steinberg::UString(string128, 128).fromAscii(
"UsedAsPanner");
325 default: Steinberg::UString(string128, 128).fromAscii(
"unknown!");
338 for (
int i = 0; i < pPlug->NParams(); i++)
340 double normalized = pPlug->GetParam(i)->GetNormalized();
341 mParameters.getParameter(i)->setNormalized(normalized);
344 if (mBypassParameter)
345 mBypassParameter->setNormalized(savedBypass);
350 bool SetVST3ParamNormalized(Steinberg::Vst::ParamID tag, Steinberg::Vst::ParamValue value)
352 Steinberg::Vst::Parameter* parameter = mParameters.getParameter(tag);
357 parameter->setNormalized(value);
362 Steinberg::Vst::ParameterContainer& mParameters;
366 WDL_String mChannelName;
367 WDL_String mChannelNamespace;
368 WDL_String mChannelUID;
369 int mChannelNamespaceIndex = 0;
370 int mChannelIndex = 0;
371 unsigned int mChannelColor = 0;
MIDI and sysex structs/utilites.
void SetNormalized(double normalizedValue)
Sets the parameter value from a normalized range (usually coming from the linked IControl)
const char * GetGroup() const
Returns the parameter's group.
The base class of an IPlug plug-in, which interacts with the different plug-in APIs.
virtual bool GetMidiNoteText(int noteNumber, char *str) const
Override this method to provide custom text linked to MIDI note numbers in API classes that support t...
VST3 bypass parameter helper.
Shared VST3 controller code.
VST3 preset parameter helper.
int AddParamGroup(const char *name)
Called to add a parameter group name, when a unique group name is discovered.
bool RestorePreset(int idx)
Restore a preset by index.
const char * GetParamGroupName(int idx) const
Get the parameter group name as a particular index.
const char * GetPresetName(int idx) const
Get the name a preset.
int NPresets() const
Gets the number of factory presets.
static const char * CCNameStr(int idx)
Get the CC name as a CString.