Loading...
Searching...
No Matches
score-plugin-vst3/Vst3/EffectModel.hpp
1#pragma once
2#include <Process/Dataflow/PortFactory.hpp>
3#include <Process/GenericProcessFactory.hpp>
4#include <Process/Process.hpp>
5
6#include <Control/DefaultEffectItem.hpp>
7#include <Effect/EffectFactory.hpp>
8#include <Vst3/Plugin.hpp>
9#include <Vst3/UI/WindowContainer.hpp>
10
11#include <score/tools/std/Invoke.hpp>
12
13#include <ossia/detail/hash_map.hpp>
14
15#include <verdigris>
16
17#include <optional>
18
19#include <public.sdk/source/vst/utility/uid.h>
20#define VST_DEFAULT_PARAM_NUMBER_CUTOFF 10
21
22namespace vst3
23{
24class Model;
25class ControlInlet;
26}
27PROCESS_METADATA(
28 , vst3::Model, "4cc30435-3237-4e94-a79e-1c2bd6b724a1", "VST 3", "VST 3",
29 Process::ProcessCategory::Other, "Plugins", "VST 3 plug-in",
30 "VST is a trademark of Steinberg Media Technologies GmbH", {}, {}, {},
31 QUrl("https://ossia.io/score-docs/processes/audio-plugins.html#common-formats-vst-vst3-lv2-jsfx"),
32 Process::ProcessFlags::ExternalEffect)
33UUID_METADATA(
34 , Process::Port, vst3::ControlInlet, "82b24dd8-fbc0-43a6-adfa-7bb29ca48660")
35DESCRIPTION_METADATA(, vst3::Model, "VST")
36namespace vst3
37{
38
39class CreateVSTControl;
40class ControlInlet;
41struct PortCreationVisitor;
42class PlugFrame;
43class Window;
44class Model final : public Process::ProcessModel
45{
46 W_OBJECT(Model)
47 SCORE_SERIALIZE_FRIENDS
48 friend class vst3::CreateVSTControl;
49
50public:
51 PROCESS_METADATA_IMPL(Model)
52 Model(
53 TimeVal t, const QString& name, const Id<Process::ProcessModel>&, QObject* parent);
54
55 ~Model() override;
56 template <typename Impl>
57 Model(Impl& vis, QObject* parent)
58 : ProcessModel{vis, parent}
59 {
60 init();
61 vis.writeTo(*this);
62 }
63
64 ControlInlet* getControl(const Id<Process::Port>& p) const;
65 QString effect() const noexcept override;
66 QString prettyName() const noexcept override;
67 bool hasExternalUI() const noexcept;
68
69 void mapExternalFiles(Process::ExternalFileMap& map) override;
70
71 Plugin fx{};
72
73 ossia::hash_map<Steinberg::Vst::ParamID, ControlInlet*> controls;
74
75 void removeControl(const Id<Process::Port>&);
76 void removeControl(Steinberg::Vst::ParamID fxnum);
77
78 void addControlFromEditor(Steinberg::Vst::ParamID id);
79 void on_addControl(const Steinberg::Vst::ParameterInfo& v);
80 void on_addControl_impl(ControlInlet* inl, const Steinberg::Vst::ParameterInfo*);
81 void initControl(ControlInlet* inl, const Steinberg::Vst::ParameterInfo*);
82
83 void reloadControls();
84 Steinberg::tresult restartComponent(int32_t flags);
85
86private:
87 void loadPreset(const Process::Preset& preset) override;
89 void loadProgram(int index);
92 bool presetChangesPorts(const Process::Preset&) const noexcept override
93 {
94 return false;
95 }
96 Process::Preset savePreset() const noexcept override;
97 std::vector<Process::Preset> builtinPresets() const noexcept override;
98
99 void init();
100 void create();
101 void load();
102 void mapAllControls(int numParams);
105 std::optional<Steinberg::Vst::ParameterInfo> programChangeParameter() const;
107 void addProgramChangeControl();
108 QByteArray readProcessorState() const;
109 QByteArray readControllerState() const;
110 void writeState();
111
112 QString m_vstPath;
113 VST3::UID m_uid{};
114
115 QByteArray m_savedProcessorState;
116 QByteArray m_savedControllerState;
117
118 ossia::hash_map<Steinberg::Vst::ParamID, int32_t> m_paramToIndex;
119
120 void closePlugin();
121 void initFx();
122
123 friend struct PortCreationVisitor;
124};
125}
126
127namespace Process
128{
129template <>
130QString EffectProcessFactory_T<vst3::Model>::customConstructionData() const noexcept;
131
132template <>
133Process::Descriptor
134EffectProcessFactory_T<vst3::Model>::descriptor(QString d) const noexcept;
135}
136
137namespace vst3
138{
139using VSTEffectFactory = Process::EffectProcessFactory_T<Model>;
140}
Definition EffectFactory.hpp:14
Collects — and in the same pass rewrites — the files a document references.
Definition ExternalFiles.hpp:93
Definition Port.hpp:106
The Process class.
Definition score-lib-process/Process/Process.hpp:82
The id_base_t class.
Definition Identifier.hpp:59
Definition /Vst3/Control.hpp:19
Definition score-plugin-vst3/Vst3/EffectModel.hpp:45
Base classes and tools to implement processes and layers.
Definition JSONVisitor.hpp:1115
Definition Preset.hpp:32
Definition TimeValue.hpp:21
Definition Plugin.hpp:53
Definition score-plugin-vst3/Vst3/EffectModel.cpp:413