1 #pragma once
2 
3 #include <QVariant>
4 #include <QString>
5 #include <QtDebug>
6 #include <QSharedPointer>
7 
8 class EffectManifestParameter;
9 typedef QSharedPointer<EffectManifestParameter> EffectManifestParameterPointer;
10 
11 class EffectManifestParameter {
12   public:
13     enum class ControlHint {
14         UNKNOWN = 0,
15         KNOB_LINEAR,
16         KNOB_LINEAR_INVERSE,
17         KNOB_LOGARITHMIC,
18         KNOB_LOGARITHMIC_INVERSE,
19         KNOB_STEPPING,   // A step rotary, steps given by m_steps
20                          // are arranged with equal distance on scale
21         TOGGLE_STEPPING  // For button and enum controls, not accessible
22                          // from many controllers, no linking to meta knob
23     };
24 
25     enum class SemanticHint {
26         UNKNOWN = 0,
27         SAMPLES,
28         NOTE,
29     };
30 
31     enum class UnitsHint {
32         UNKNOWN = 0,
33         TIME,
34         HERTZ,
35         SAMPLERATE, // fraction of the samplerate
36         BEATS, // multiples of a beat
37     };
38 
39     enum class LinkType : int {
40         NONE = 0,          // Not controlled by the meta knob
41         LINKED,            // Controlled by the meta knob as it is
42         LINKED_LEFT,       // Controlled by the left side of the meta knob
43         LINKED_RIGHT,      // Controlled by the right side of the meta knob
44         LINKED_LEFT_RIGHT, // Controlled by both sides of the meta knob
45         NUM_LINK_TYPES
46     };
47 
LinkTypeToString(LinkType type)48     static QString LinkTypeToString (LinkType type) {
49         if (type == LinkType::LINKED) {
50             return "LINKED";
51         } else if (type == LinkType::LINKED_LEFT) {
52             return "LINKED_LEFT";
53         } else if (type == LinkType::LINKED_RIGHT) {
54             return "LINKED_RIGHT";
55         } else if (type == LinkType::LINKED_LEFT_RIGHT) {
56             return "LINKED_LEFT_RIGHT";
57         } else {
58             return "NONE";
59         }
60     }
61 
LinkTypeFromString(const QString & string)62     static LinkType LinkTypeFromString (const QString& string) {
63         if (string == "LINKED") {
64             return LinkType::LINKED;
65         } else if (string == "LINKED_LEFT") {
66             return LinkType::LINKED_LEFT;
67         } else if (string == "LINKED_RIGHT") {
68             return LinkType::LINKED_RIGHT;
69         } else if (string == "LINKED_LEFT_RIGHT") {
70             return LinkType::LINKED_LEFT_RIGHT;
71         } else {
72             return LinkType::NONE;
73         }
74     }
75 
76     enum class LinkInversion {
77         NOT_INVERTED = 0,
78         INVERTED = 1
79     };
80 
EffectManifestParameter()81     EffectManifestParameter()
82             : m_controlHint(ControlHint::UNKNOWN),
83               m_semanticHint(SemanticHint::UNKNOWN),
84               m_unitsHint(UnitsHint::UNKNOWN),
85               m_defaultLinkType(LinkType::NONE),
86               m_defaultLinkInversion(LinkInversion::NOT_INVERTED),
87               m_neutralPointOnScale(0.0),
88               m_default(0),
89               m_minimum(0),
90               m_maximum(1.0),
91               m_showInParametertSlot(true) {
92     }
93 
~EffectManifestParameter()94     virtual ~EffectManifestParameter() {
95         //qDebug() << debugString() << "destroyed";
96     }
97 
98     ////////////////////////////////////////////////////////////////////////////////
99     // Parameter Information
100     ////////////////////////////////////////////////////////////////////////////////
101 
id()102     virtual const QString& id() const {
103         return m_id;
104     }
setId(const QString & id)105     virtual void setId(const QString& id) {
106         m_id = id;
107     }
108 
name()109     virtual const QString& name() const {
110         return m_name;
111     }
setName(const QString & name)112     virtual void setName(const QString& name) {
113         m_name = name;
114     }
115 
shortName()116     virtual const QString& shortName() const {
117         return m_shortName;
118     }
setShortName(const QString & shortName)119     virtual void setShortName(const QString& shortName) {
120         m_shortName = shortName;
121     }
122 
description()123     virtual const QString& description() const {
124         return m_description;
125     }
setDescription(const QString & description)126     virtual void setDescription(const QString& description) {
127         m_description = description;
128     }
129 
130     ////////////////////////////////////////////////////////////////////////////////
131     // Usage hints
132     ////////////////////////////////////////////////////////////////////////////////
133 
controlHint()134     virtual ControlHint controlHint() const {
135         return m_controlHint;
136     }
setControlHint(ControlHint controlHint)137     virtual void setControlHint(ControlHint controlHint) {
138         m_controlHint = controlHint;
139     }
140 
semanticHint()141     virtual SemanticHint semanticHint() const {
142         return m_semanticHint;
143     }
setSemanticHint(SemanticHint semanticHint)144     virtual void setSemanticHint(SemanticHint semanticHint) {
145         m_semanticHint = semanticHint;
146     }
147 
unitsHint()148     virtual UnitsHint unitsHint() const {
149         return m_unitsHint;
150     }
setUnitsHint(UnitsHint unitsHint)151     virtual void setUnitsHint(UnitsHint unitsHint) {
152         m_unitsHint = unitsHint;
153     }
154 
defaultLinkType()155     virtual LinkType defaultLinkType() const {
156         return m_defaultLinkType;
157     }
setDefaultLinkType(const LinkType linkType)158     virtual void setDefaultLinkType(const LinkType linkType) {
159         m_defaultLinkType = linkType;
160     }
161 
defaultLinkInversion()162     virtual LinkInversion defaultLinkInversion() const {
163         return m_defaultLinkInversion;
164     }
setDefaultLinkInversion(const LinkInversion linkInversion)165     virtual void setDefaultLinkInversion(const LinkInversion linkInversion) {
166         m_defaultLinkInversion = linkInversion;
167     }
168 
169 
170     // Neutral Point On Scale is the parameter in the range 0 .. 1 on the knob that
171     // is adopted as neutral when controlled by the meta knob.
172     // This is allows to link the meta knob in a way that two effects are
173     // cranked in simultaneous, or in case of a split filter like meta knob,
174     // both effects are neutral at meta knob center.
175     // A EQ Gain has usually a neutral point of 0.5 (0 dB) while a delay knob
176     // has a neutral point of 0.0 (no delay)
177     // A EQ Gain knob cannot be used on a split meta knob.
neutralPointOnScale()178     virtual double neutralPointOnScale() const {
179         return m_neutralPointOnScale;
180     }
setNeutralPointOnScale(double neutralPoint)181     virtual void setNeutralPointOnScale(double neutralPoint) {
182         m_neutralPointOnScale = neutralPoint;
183     }
184 
185 
186     // These store the mapping between the parameter slot and
187     // the effective parameter which is loaded onto the slot.
188     // This is required because we have only 8 parameter slots, but
189     // LV2 or VST effects can have more then 8.
showInParameterSlot()190     virtual bool showInParameterSlot() const {
191         return m_showInParametertSlot;
192     }
setShowInParameterSlot(double show)193     virtual void setShowInParameterSlot(double show) {
194         m_showInParametertSlot = show != 0;
195     }
196 
197     ////////////////////////////////////////////////////////////////////////////////
198     // Value Settings
199     ////////////////////////////////////////////////////////////////////////////////
200 
getDefault()201     virtual const double& getDefault() const {
202         return m_default;
203     }
setDefault(const double & defaultValue)204     virtual void setDefault(const double& defaultValue) {
205         m_default = defaultValue;
206     }
207 
getMinimum()208     virtual const double& getMinimum() const {
209         return m_minimum;
210     }
setMinimum(const double & minimum)211     virtual void setMinimum(const double& minimum) {
212         m_minimum = minimum;
213     }
214 
getMaximum()215     virtual const double& getMaximum() const {
216         return m_maximum;
217     }
setMaximum(const double & maximum)218     virtual void setMaximum(const double& maximum) {
219         m_maximum = maximum;
220     }
221 
appendStep(const QPair<QString,double> & step)222     virtual void appendStep(const QPair<QString, double>& step) {
223         m_steps.append(step);
224     }
getSteps()225     virtual const QList<QPair<QString, double> >& getSteps() const {
226         return m_steps;
227     }
228 
229   private:
debugString()230     QString debugString() const {
231         return QString("EffectManifestParameter(%1)").arg(m_id);
232     }
233 
234     QString m_id;
235     QString m_name;
236     QString m_shortName;
237     QString m_description;
238 
239     ControlHint m_controlHint;
240     SemanticHint m_semanticHint;
241     UnitsHint m_unitsHint;
242     LinkType m_defaultLinkType;
243     LinkInversion m_defaultLinkInversion;
244     double m_neutralPointOnScale;
245 
246     double m_default;
247     double m_minimum;
248     double m_maximum;
249 
250     // Used to describe steps of
251     // CONTROL_KNOB_STEPPING and CONTROL_TOGGLE_STEPPING
252     // effect parameters
253     // Each pair has the following form:
254     // name - value
255     QList<QPair<QString, double> > m_steps;
256 
257     bool m_showInParametertSlot;
258 };
259 
260 QDebug operator<<(QDebug dbg, const EffectManifestParameter& parameter);
261