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 
10 #include <score/tools/std/Invoke.hpp>
11 
12 #include <ossia/detail/hash_map.hpp>
13 
14 #include <verdigris>
15 
16 #include <public.sdk/source/vst/utility/uid.h>
17 #define VST_DEFAULT_PARAM_NUMBER_CUTOFF 10
18 
19 namespace vst3
20 {
21 class Model;
22 class ControlInlet;
23 }
24 PROCESS_METADATA(
25  , vst3::Model, "4cc30435-3237-4e94-a79e-1c2bd6b724a1", "VST 3", "VST 3",
26  Process::ProcessCategory::Other, "Plugins", "VST 3 plug-in",
27  "VST is a trademark of Steinberg Media Technologies GmbH", {}, {}, {},
28  Process::ProcessFlags::ExternalEffect)
29 UUID_METADATA(
30  , Process::Port, vst3::ControlInlet, "82b24dd8-fbc0-43a6-adfa-7bb29ca48660")
31 DESCRIPTION_METADATA(, vst3::Model, "VST")
32 namespace vst3
33 {
34 
35 class CreateVSTControl;
36 class ControlInlet;
37 struct PortCreationVisitor;
38 
39 class Model final : public Process::ProcessModel
40 {
41  W_OBJECT(Model)
42  SCORE_SERIALIZE_FRIENDS
43  friend class vst3::CreateVSTControl;
44 
45 public:
46  PROCESS_METADATA_IMPL(Model)
47  Model(
48  TimeVal t, const QString& name, const Id<Process::ProcessModel>&, QObject* parent);
49 
50  ~Model() override;
51  template <typename Impl>
52  Model(Impl& vis, QObject* parent)
53  : ProcessModel{vis, parent}
54  {
55  init();
56  vis.writeTo(*this);
57  }
58 
59  ControlInlet* getControl(const Id<Process::Port>& p) const;
60  QString effect() const noexcept override;
61  QString prettyName() const noexcept override;
62  bool hasExternalUI() const noexcept;
63 
64  Plugin fx{};
65 
66  ossia::hash_map<Steinberg::Vst::ParamID, ControlInlet*> controls;
67 
68  void removeControl(const Id<Process::Port>&);
69  void removeControl(Steinberg::Vst::ParamID fxnum);
70 
71  void addControlFromEditor(Steinberg::Vst::ParamID id);
72  void on_addControl(const Steinberg::Vst::ParameterInfo& v);
73  void on_addControl_impl(ControlInlet* inl);
74  void initControl(ControlInlet* inl);
75 
76  void reloadControls();
77  Steinberg::tresult restartComponent(int32_t flags);
78 
79 private:
80  void loadPreset(const Process::Preset& preset) override;
81  Process::Preset savePreset() const noexcept override;
82  std::vector<Process::Preset> builtinPresets() const noexcept override;
83 
84  void init();
85  void create();
86  void load();
87  void mapAllControls(int numParams);
88  QByteArray readProcessorState() const;
89  QByteArray readControllerState() const;
90  void writeState();
91 
92  QString m_vstPath;
93  VST3::UID m_uid{};
94 
95  QByteArray m_savedProcessorState;
96  QByteArray m_savedControllerState;
97 
98  ossia::hash_map<Steinberg::Vst::ParamID, int32_t> m_paramToIndex;
99 
100  void closePlugin();
101  void initFx();
102 
103  friend struct PortCreationVisitor;
104 };
105 }
106 
107 namespace Process
108 {
109 template <>
110 QString EffectProcessFactory_T<vst3::Model>::customConstructionData() const noexcept;
111 
112 template <>
113 Process::Descriptor
114 EffectProcessFactory_T<vst3::Model>::descriptor(QString d) const noexcept;
115 }
116 
117 namespace vst3
118 {
119 using VSTEffectFactory = Process::EffectProcessFactory_T<Model>;
120 }
Definition: QmlObjects.hpp:109
Definition: EffectFactory.hpp:14
Definition: score-lib-process/Process/Dataflow/Port.hpp:102
The Process class.
Definition: score-lib-process/Process/Process.hpp:61
The id_base_t class.
Definition: Identifier.hpp:57
Definition: /Vst3/Control.hpp:15
Definition: score-plugin-vst3/Vst3/EffectModel.hpp:40
Base classes and tools to implement processes and layers.
Definition: JSONVisitor.hpp:1324
Definition: Preset.hpp:32
Definition: TimeValue.hpp:21
Definition: Plugin.hpp:37
Definition: score-plugin-vst3/Vst3/EffectModel.cpp:384