Loading...
Searching...
No Matches
score-plugin-vst/Vst/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 <Vst/Loader.hpp>
9
10#include <score/tools/std/Invoke.hpp>
11
12#include <ossia/detail/hash_map.hpp>
13
14#include <score_plugin_vst_export.h>
15
16#include <verdigris>
17namespace vst
18{
19class Model;
20class ControlInlet;
21}
22PROCESS_METADATA(
23 , vst::Model, "BE8E6BD3-75F2-4102-8895-8A4EB4EA545A", "VST", "VST",
24 Process::ProcessCategory::Other, "Plugins", "VST plug-in",
25 "VST is a trademark of Steinberg Media Technologies GmbH", {}, {}, {},
26 QUrl("https://ossia.io/score-docs/processes/audio-plugins.html#controlling-vst-parameters"),
27 Process::ProcessFlags::ExternalEffect)
28UUID_METADATA(, Process::Port, vst::ControlInlet, "e523bc44-8599-4a04-94c1-04ce0d1a692a")
29DESCRIPTION_METADATA(, vst::Model, "")
30namespace vst
31{
32#define VST_FIRST_CONTROL_INDEX(synth) ((synth) ? 2 : 1)
33struct SCORE_PLUGIN_VST_EXPORT AEffectWrapper
34{
35 AEffect* fx{};
38 VstTimeInfo info{
39 .samplePos = 0.,
40 .sampleRate = 44100.,
41 .nanoSeconds = 0.,
42 .ppqPos = 0.,
43 .tempo = 120.,
44 .barStartPos = 0.,
45 .cycleStartPos = 0.,
46 .cycleEndPos = 0.,
47 .timeSigNumerator = 4,
48 .timeSigDenominator = 4,
49 .smpteOffset = 0,
50 .smpteFrameRate = 0,
51 .samplesToNextClock = 0,
52 .flags = kVstPpqPosValid | kVstTempoValid | kVstBarsValid | kVstTimeSigValid};
53 bool ui_opened{};
54
55 AEffectWrapper(AEffect* f) noexcept
56 : fx{f}
57 {
58 }
59
60 auto getParameter(int32_t index) const noexcept { return fx->getParameter(fx, index); }
61 auto setParameter(int32_t index, float p) const noexcept
62 {
63 return fx->setParameter(fx, index, p);
64 }
65
66 auto dispatch(
67 int32_t opcode, int32_t index = 0, intptr_t value = 0, void* ptr = nullptr,
68 float opt = 0.0f) const noexcept
69 {
70 return fx->dispatcher(fx, opcode, index, value, ptr, opt);
71 }
72
73 ~AEffectWrapper();
74};
75
76class CreateControl;
77class ControlInlet;
78class SCORE_PLUGIN_VST_TEST_EXPORT Model final : public Process::ProcessModel
79{
80 W_OBJECT(Model)
81 SCORE_SERIALIZE_FRIENDS
82 friend class vst::CreateControl;
83
84public:
85 MODEL_METADATA_IMPL(Model)
86 Model(
87 TimeVal t, const QString& name, const Id<Process::ProcessModel>&, QObject* parent);
88
89 ~Model() override;
90 template <typename Impl>
91 Model(Impl& vis, QObject* parent)
92 : ProcessModel{vis, parent}
93 , m_registration{*this}
94 {
95 init();
96 vis.writeTo(*this);
97 }
98
99 QString prettyShortName() const noexcept override
100 {
102 }
103 QString category() const noexcept override
104 {
106 }
107 QStringList tags() const noexcept override { return Metadata<Tags_k, Model>::get(); }
108 Process::ProcessFlags flags() const noexcept override;
109 void setCreatingControls(bool ok) override;
110
111 ControlInlet* getControl(const Id<Process::Port>& p) const;
112 QString effect() const noexcept override;
113 QString prettyName() const noexcept override;
114 bool hasExternalUI() const noexcept;
115
119 bool takesMidi() const noexcept;
120
123 bool sendsMidi() const noexcept;
124
125 std::shared_ptr<AEffectWrapper> fx{};
126
127 ossia::hash_map<int, ControlInlet*> controls;
128
129 void removeControl(const Id<Process::Port>&);
130 void removeControl(int fxnum);
131
132 //void addControl(int idx, float v) W_SIGNAL(addControl, idx, v);
133 void on_addControl(int idx, float v);
134 W_SLOT(on_addControl);
135 void on_addControl_impl(ControlInlet* inl);
136 void on_controlChangedFromScore(int num, float newval);
137
138 void reloadControls();
139 void reloadPrograms();
140
141 auto dispatch(
142 int32_t opcode, int32_t index = 0, intptr_t value = 0, void* ptr = nullptr,
143 float opt = 0.0f)
144 {
145 return fx->dispatch(opcode, index, value, ptr, opt);
146 }
147
150 void selectProgram(int index);
151
152 std::atomic_bool needIdle{};
153
157 std::string m_backup_chunk;
158 ossia::float_vector m_backup_float_data;
159 int32_t m_backup_program{-1};
160
161private:
162 void loadPreset(const Process::Preset& preset) override;
165 bool presetChangesPorts(const Process::Preset&) const noexcept override
166 {
167 return false;
168 }
169 Process::Preset savePreset() const noexcept override;
170 std::vector<Process::Preset> builtinPresets() const noexcept override;
171
172 QString getString(AEffectOpcodes op, int param);
173 void setControlName(int fxnum, ControlInlet* ctrl);
174 void init();
175 void create();
176 void load();
177 void closePlugin();
178 void initFx();
179
180 std::vector<std::pair<std::string, int>> m_programs;
181 int32_t m_effectId{};
182 bool m_createControls{};
183
184 struct vst_context_handler
185 {
186 Model& self;
187 explicit vst_context_handler(Model& self);
188 ~vst_context_handler();
189 } m_registration;
190};
191
192// VSTModule* getPlugin(QString path);
193AEffect* getPluginInstance(int32_t id);
194intptr_t vst_host_callback(
195 AEffect* effect, int32_t opcode, int32_t index, intptr_t value, void* ptr,
196 float opt);
197}
198
199namespace Process
200{
201template <>
202QString EffectProcessFactory_T<vst::Model>::customConstructionData() const noexcept;
203
204template <>
205Process::Descriptor
206EffectProcessFactory_T<vst::Model>::descriptor(QString d) const noexcept;
207}
208
209template <>
210SCORE_PLUGIN_VST_TEST_EXPORT void JSONWriter::write(vst::Model& eff);
211
212namespace vst
213{
214using VSTEffectFactory = Process::EffectProcessFactory_T<Model>;
215}
Definition JSONVisitor.hpp:423
Definition EffectFactory.hpp:14
Definition Port.hpp:106
The Process class.
Definition score-lib-process/Process/Process.hpp:82
virtual bool presetChangesPorts(const Preset &preset) const noexcept
Definition score-lib-process/Process/Process.cpp:264
The id_base_t class.
Definition Identifier.hpp:59
Definition Vst/Control.hpp:19
Definition plugins/score-plugin-vst/Vst/commands.hpp:41
Base classes and tools to implement processes and layers.
Definition JSONVisitor.hpp:1115
bool loadPreset(const Process::ProcessModel &proc, const Process::Preset &preset, const score::DocumentContext &ctx)
Definition PresetTree.cpp:167
ProcessFlags
Various settings for processes.
Definition ProcessFlags.hpp:17
STL namespace.
Static metadata implementation.
Definition lib/score/tools/Metadata.hpp:36
Definition Preset.hpp:32
Definition TimeValue.hpp:21