StoneyVCV v2
StoneyDSP Modules for VCV Rack 2.
Loading...
Searching...
No Matches
StoneyVCV.hpp
Go to the documentation of this file.
1
31#pragma once
32
33#define STONEYVCV_HPP_INCLUDED 1
34
35//==============================================================================
36
37#include <rack.hpp>
38#include <StoneyDSP/Core.hpp>
39
40//==============================================================================
41
42#ifdef STONEYDSP_DEBUG
43 #include <iostream>
44 #define DBG(msg, ...) do { ::std::cerr << std::string(msg, ##__VA_ARGS__) << std::endl; } while (0)
45#else
46 #define DBG(msg, ...) ::StoneyDSP::ignoreUnused(msg, ##__VA_ARGS__)
47#endif
48
49#ifdef STONEYDSP_DEBUG
50 #define assert_message(condition, message) assert((condition) && (message))
51#else
52 #define assert_message(condition, message) ::StoneyDSP::ignoreUnused(condition, message)
53#endif
54
55// #if defined (STONEYDSP_DEBUG)
56// #include <iostream>
57// #define DBG(x, ...) do { x } while (false)
58// #else
59// #define DBG(msg, ...) ::StoneyDSP::ignoreUnused(msg, ##__VA_ARGS__)
60// #endif
61
62// #if defined (STONEYDSP_DEBUG)
63// #include <iostream>
64// #define DBG(x, ...) DEBUG(x, ##__VA_ARGS__)
65// #else
66// #define DBG(msg, ...) ::StoneyDSP::ignoreUnused(msg, ##__VA_ARGS__)
67// #endif
68
69//==============================================================================
70
78namespace StoneyDSP {
83//==============================================================================
84
92namespace StoneyVCV
93{
98//==============================================================================
99
100namespace Tools {
105//==============================================================================
106
107const extern ::StoneyDSP::float_t vMin;
108const extern ::StoneyDSP::float_t vMax;
109const extern ::StoneyDSP::float_t vNominal;
110const extern ::StoneyDSP::float_t vBias;
111const extern ::StoneyDSP::float_t vGround;
112const extern ::StoneyDSP::float_t vFloor;
113
114//==============================================================================
115
117} // namespace Tools
118
119//==============================================================================
120
121// Declare an abstract base class with a pure virtual destructor.
122// It's the simplest possible abstract class.
123template <typename T>
124struct Engine
125{
126
127 //==========================================================================
128
129public:
130
131 //==========================================================================
132
134 {
135 DBG("Constructing StoneyDSP::StoneyVCV::Engine");
136 };
137
138 virtual ~Engine() noexcept = 0; // pure virtual
139
140 //==========================================================================
141
142 virtual void processSample(T* sample) = 0; // pure virtual
143
144 //==========================================================================
145
146private:
147
148 //==========================================================================
149
150 STONEYDSP_DECLARE_NON_COPYABLE(Engine)
151 STONEYDSP_DECLARE_NON_MOVEABLE(Engine)
152 // STONEYDSP_PREVENT_HEAP_ALLOCATION
153};
154
155template <class T>
156::StoneyDSP::StoneyVCV::Engine<T>::~Engine() noexcept
157{
158 DBG("Destroying StoneyDSP::StoneyVCV::Engine");
159}
160
161// Explicit instantiations to ensure the definition is visible to the linker...
162template struct ::StoneyDSP::StoneyVCV::Engine<double>;
163template struct ::StoneyDSP::StoneyVCV::Engine<float>;
164
165//==============================================================================
166
174template <class TWidget = ::rack::widget::Widget>
175inline TWidget *createWidget(::rack::math::Vec pos)
176{
177 static_assert(::std::is_base_of<::rack::widget::Widget, TWidget>::value, "TWidget must be derived from rack::widget::Widget");
178
179 TWidget *o = new TWidget;
180 o->box.pos = pos;
181 return o;
182}
183// Explicit instantiations to ensure the definition is visible to the linker...
184template ::rack::widget::Widget *::StoneyDSP::StoneyVCV::createWidget<::rack::widget::Widget>(::rack::math::Vec pos);
185
186//==============================================================================
187
195template <class TWidget = ::rack::widget::Widget>
196inline TWidget *createWidgetCentered(::rack::math::Vec pos)
197{
199 o->box.pos = o->box.pos.minus(o->box.size.div(2));
200 return o;
201}
202// Explicit instantiations to ensure the definition is visible to the linker...
203template ::rack::widget::Widget *::StoneyDSP::StoneyVCV::createWidgetCentered<::rack::widget::Widget>(::rack::math::Vec pos);
204
205//==============================================================================
206
216template <class TWidget = ::rack::widget::Widget>
217inline TWidget *createWidgetSized(::rack::math::Vec pos, ::rack::math::Vec size)
218{
220 o->box.size = size;
221 return o;
222}
223// Explicit instantiations to ensure the definition is visible to the linker...
224template ::rack::widget::Widget *::StoneyDSP::StoneyVCV::createWidgetSized<::rack::widget::Widget>(::rack::math::Vec pos, ::rack::math::Vec size);
225
226//==============================================================================
227
236template <class TWidget = ::rack::widget::Widget>
237inline TWidget *createWidgetCenteredSized(::rack::math::Vec pos, ::rack::math::Vec size)
238{
240 o->box.size = size;
241 return o;
242}
243// Explicit instantiations to ensure the definition is visible to the linker...
244template ::rack::widget::Widget *::StoneyDSP::StoneyVCV::createWidgetCenteredSized<::rack::widget::Widget>(::rack::math::Vec pos, ::rack::math::Vec size);
245
246//==============================================================================
247
259template <class TParamWidget = ::rack::app::ParamWidget>
260inline TParamWidget *createParamWidget(::rack::math::Vec pos, ::rack::engine::Module* module, int paramId)
261{
262 using namespace rack;
263
264 static_assert(::std::is_base_of<::rack::app::ParamWidget, TParamWidget>::value, "TParamWidget must be derived from rack::app::ParamWidget");
265
267 o->box.pos = pos;
268 o->app::ParamWidget::module = module;
269 o->app::ParamWidget::paramId = paramId;
270 o->initParamQuantity();
271 return o;
272}
273// Explicit instantiations to ensure the definition is visible to the linker...
274template ::rack::app::ParamWidget *::StoneyDSP::StoneyVCV::createParamWidget<::rack::app::ParamWidget>(::rack::math::Vec pos, ::rack::engine::Module* module, int paramId);
275
276//==============================================================================
277
289template <class TParamWidget = ::rack::app::ParamWidget>
290inline TParamWidget *createParamWidgetCentered(::rack::math::Vec pos, ::rack::engine::Module* module, int paramId)
291{
293 o->box.pos = o->box.pos.minus(o->box.size.div(2));
294 return o;
295}
296// Explicit instantiations to ensure the definition is visible to the linker...
297template ::rack::app::ParamWidget *::StoneyDSP::StoneyVCV::createParamWidgetCentered<::rack::app::ParamWidget>(::rack::math::Vec pos, ::rack::engine::Module* module, int paramId);
298
299//==============================================================================
300
312template <class TPortWidget = ::rack::app::PortWidget>
313inline TPortWidget *createInput(::rack::math::Vec pos, ::rack::engine::Module *module, int inputId)
314{
315 // Import some namespaces for convenience
316 using namespace ::rack;
317
318 static_assert(::std::is_base_of<::rack::app::PortWidget, TPortWidget>::value, "TPortWidget must be derived from rack::app::PortWidget");
319
321 o->box.pos = pos;
322 o->app::PortWidget::module = module;
323 o->app::PortWidget::type = ::rack::engine::Port::INPUT;
324 o->app::PortWidget::portId = inputId;
325 return o;
326}
327// Explicit instantiations to ensure the definition is visible to the linker...
328template ::rack::app::PortWidget *::StoneyDSP::StoneyVCV::createInput<::rack::app::PortWidget>(::rack::math::Vec pos, ::rack::engine::Module *module, int inputId);
329
330//==============================================================================
331
343template <class TPortWidget = ::rack::app::PortWidget>
344inline TPortWidget *createInputCentered(::rack::math::Vec pos, ::rack::engine::Module* module, int inputId)
345{
347 o->box.pos = o->box.pos.minus(o->box.size.div(2));
348 return o;
349}
350// Explicit instantiations to ensure the definition is visible to the linker...
351template ::rack::app::PortWidget *::StoneyDSP::StoneyVCV::createInputCentered<::rack::app::PortWidget>(::rack::math::Vec pos, ::rack::engine::Module *module, int inputId);
352
353//==============================================================================
354
366template <class TPortWidget = ::rack::app::PortWidget>
367inline TPortWidget* createOutput(::rack::math::Vec pos, ::rack::engine::Module *module, int outputId)
368{
369 // Import some namespaces for convenience
370 using namespace ::rack;
371
372 static_assert(::std::is_base_of<::rack::app::PortWidget, TPortWidget>::value, "TPortWidget must be derived from rack::app::PortWidget");
373
375 o->box.pos = pos;
376 o->app::PortWidget::module = module;
377 o->app::PortWidget::type = ::rack::engine::Port::OUTPUT;
378 o->app::PortWidget::portId = outputId;
379 return o;
380}
381// Explicit instantiations to ensure the definition is visible to the linker...
382template ::rack::app::PortWidget *::StoneyDSP::StoneyVCV::createOutput<::rack::app::PortWidget>(::rack::math::Vec pos, ::rack::engine::Module *module, int inputId);
383
384//==============================================================================
385
397template <class TPortWidget = ::rack::app::PortWidget>
398inline TPortWidget *createOutputCentered(::rack::math::Vec pos, ::rack::engine::Module *module, int outputId)
399{
401 o->box.pos = o->box.pos.minus(o->box.size.div(2));
402 return o;
403}
404// Explicit instantiations to ensure the definition is visible to the linker...
405template ::rack::app::PortWidget *::StoneyDSP::StoneyVCV::createOutputCentered<::rack::app::PortWidget>(::rack::math::Vec pos, ::rack::engine::Module *module, int inputId);
406
407//==============================================================================
408
410} // namespace StoneyVCV
411
412//==============================================================================
413
415} // namespace StoneyDSP
416
417//==============================================================================
418
419
420//==============================================================================
421
426#define STONEYVCV_DECLARE_WIDGET_FACTORY_FUNCTIONS(ClassName) \
427public: \
428 template <class TWidget> \
429 friend TWidget *::rack::createWidget(::rack::math::Vec pos); \
430 \
431 template <class TWidget> \
432 friend TWidget *::rack::createWidgetCentered(::rack::math::Vec pos); \
433 \
434 template <class TWidget> \
435 friend TWidget *::StoneyDSP::StoneyVCV::createWidget(::rack::math::Vec pos); \
436 \
437 template <class TWidget> \
438 friend TWidget *::StoneyDSP::StoneyVCV::createWidgetCentered(::rack::math::Vec pos); \
439 \
440 template <class TWidget> \
441 friend TWidget *::StoneyDSP::StoneyVCV::createWidgetSized(::rack::math::Vec pos, ::rack::math::Vec size); \
442 \
443 template <class TWidget> \
444 friend TWidget *::StoneyDSP::StoneyVCV::createWidgetCenteredSized(::rack::math::Vec pos, ::rack::math::Vec size);
#define DBG(msg,...)
Definition StoneyVCV.hpp:46
template::rack::app::PortWidget * ::StoneyDSP::StoneyVCV::createOutputCentered<::rack::app::PortWidget >(::rack::math::Vec pos, ::rack::engine::Module *module, int inputId)
virtual ~Engine() noexcept=0
Definition StoneyVCV.hpp:156
TParamWidget * createParamWidgetCentered(::rack::math::Vec pos, ::rack::engine::Module *module, int paramId)
Definition StoneyVCV.hpp:290
TPortWidget * createOutputCentered(::rack::math::Vec pos, ::rack::engine::Module *module, int outputId)
Definition StoneyVCV.hpp:398
template::rack::app::PortWidget * ::StoneyDSP::StoneyVCV::createInputCentered<::rack::app::PortWidget >(::rack::math::Vec pos, ::rack::engine::Module *module, int inputId)
TWidget * createWidgetCenteredSized(::rack::math::Vec pos, ::rack::math::Vec size)
Creates a Widget subclass with its top-left at a position.
Definition StoneyVCV.hpp:237
template::rack::widget::Widget * ::StoneyDSP::StoneyVCV::createWidget<::rack::widget::Widget >(::rack::math::Vec pos)
TPortWidget * createOutput(::rack::math::Vec pos, ::rack::engine::Module *module, int outputId)
Definition StoneyVCV.hpp:367
template::rack::widget::Widget * ::StoneyDSP::StoneyVCV::createWidgetCentered<::rack::widget::Widget >(::rack::math::Vec pos)
template::rack::widget::Widget * ::StoneyDSP::StoneyVCV::createWidgetSized<::rack::widget::Widget >(::rack::math::Vec pos, ::rack::math::Vec size)
TWidget * createWidgetCentered(::rack::math::Vec pos)
Creates a Widget subclass with its center at a position.
Definition StoneyVCV.hpp:196
template::rack::app::ParamWidget * ::StoneyDSP::StoneyVCV::createParamWidgetCentered<::rack::app::ParamWidget >(::rack::math::Vec pos, ::rack::engine::Module *module, int paramId)
TWidget * createWidget(::rack::math::Vec pos)
Creates a Widget subclass with its top-left at a position.
Definition StoneyVCV.hpp:175
TPortWidget * createInputCentered(::rack::math::Vec pos, ::rack::engine::Module *module, int inputId)
Definition StoneyVCV.hpp:344
template::rack::app::PortWidget * ::StoneyDSP::StoneyVCV::createOutput<::rack::app::PortWidget >(::rack::math::Vec pos, ::rack::engine::Module *module, int inputId)
TPortWidget * createInput(::rack::math::Vec pos, ::rack::engine::Module *module, int inputId)
Definition StoneyVCV.hpp:313
template::rack::widget::Widget * ::StoneyDSP::StoneyVCV::createWidgetCenteredSized<::rack::widget::Widget >(::rack::math::Vec pos, ::rack::math::Vec size)
template::rack::app::ParamWidget * ::StoneyDSP::StoneyVCV::createParamWidget<::rack::app::ParamWidget >(::rack::math::Vec pos, ::rack::engine::Module *module, int paramId)
TWidget * createWidgetSized(::rack::math::Vec pos, ::rack::math::Vec size)
Creates a Widget subclass with its top-left at a position and its size set.
Definition StoneyVCV.hpp:217
TParamWidget * createParamWidget(::rack::math::Vec pos, ::rack::engine::Module *module, int paramId)
Definition StoneyVCV.hpp:260
template::rack::app::PortWidget * ::StoneyDSP::StoneyVCV::createInput<::rack::app::PortWidget >(::rack::math::Vec pos, ::rack::engine::Module *module, int inputId)
const ::StoneyDSP::float_t vBias
const ::StoneyDSP::float_t vMin
const ::StoneyDSP::float_t vGround
const ::StoneyDSP::float_t vFloor
const ::StoneyDSP::float_t vMax
const ::StoneyDSP::float_t vNominal
The StoneyDSP namespace.
Definition StoneyVCV.hpp:78
Definition StoneyVCV.hpp:125
Engine()
Definition StoneyVCV.hpp:133
virtual void processSample(T *sample)=0