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)
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;
const char * GetPresetName(int idx) const
Get the name a preset.
The base class of an IPlug plug-in, which interacts with the different plug-in APIs.
int NPresets() const
Gets the number of factory presets.
Shared VST3 controller code.
IPlug's parameter class.
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...
const char * GetParamGroupName(int idx) const
Get the parameter group name as a particular index.
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.
static const char * CCNameStr(int idx)
Get the CC name as a CString.
VST3 preset parameter helper.
bool RestorePreset(int idx)
Restore a preset by index.
VST3 bypass parameter helper.
The base class of an IPlug plug-in, which interacts with the different plug-in APIs.
int AddParamGroup(const char *name)
Called to add a parameter group name, when a unique group name is discovered.
MIDI and sysex structs/utilites.