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