iPlug2 - C++ Audio Plug-in Framework
IPlugUtilities.h
Go to the documentation of this file.
1 /*
2  ==============================================================================
3 
4  This file is part of the iPlug 2 library. Copyright (C) the iPlug 2 developers.
5 
6  See LICENSE.txt for more info.
7 
8  ==============================================================================
9 */
10 
11 #pragma once
12 
21 #include <algorithm>
22 #include <cmath>
23 #include <cstdio>
24 #include <cstdlib>
25 #include <cstring>
26 #include <cctype>
27 
28 #include "wdlstring.h"
29 
30 #include "IPlugConstants.h"
31 #include "IPlugPlatform.h"
32 
33 #ifdef OS_WIN
34 #pragma warning(disable:4018 4267) // size_t/signed/unsigned mismatch..
35 #pragma warning(disable:4800) // if (pointer) ...
36 #pragma warning(disable:4805) // Compare bool and BOOL.
37 #endif
38 
39 BEGIN_IPLUG_NAMESPACE
40 
46 template <typename T>
47 T Clip(T x, T lo, T hi) { return std::min(std::max(x, lo), hi); }
48 
53 template <typename T>
54 inline T Lerp(T a, T b, T f) { return ((b - a) * f + a); }
55 
56 static inline bool CStringHasContents(const char* str) { return str && str[0] != '\0'; }
57 
58 #define MAKE_QUOTE(str) #str
59 #define MAKE_STR(str) MAKE_QUOTE(str)
60 
62 #define GET_PARAM_FROM_VARARG(paramType, vp, v) \
63 { \
64  v = 0.0; \
65  switch (paramType) { \
66  case IParam::kTypeBool: \
67  case IParam::kTypeInt: \
68  case IParam::kTypeEnum: { \
69  v = (double) va_arg(vp, int); \
70  break; \
71  } \
72  case IParam::kTypeDouble: \
73  default: { \
74  v = (double) va_arg(vp, double); \
75  break; \
76  } \
77  } \
78 }
79 
80 #ifndef REMINDER
81 #ifdef OS_WIN
82 // This enables: #pragma REMINDER("change this line!") with click-through from VC++.
83 #define REMINDER(msg) message(__FILE__ "(" MAKE_STR(__LINE__) "): " msg)
84 #elif defined __APPLE__
85 #define REMINDER(msg) WARNING msg
86 #endif
87 #endif
88 
95 static inline double DBToAmp(double dB)
96 {
97  return std::exp(IAMP_DB * dB);
98 }
99 
103 static inline double AmpToDB(double amp)
104 {
105  return AMP_DB * std::log(std::fabs(amp));
106 }
107 
113 static inline void GetVersionParts(int versionInteger, int& maj, int& min, int& pat)
114 {
115  maj = (versionInteger & 0xFFFF0000) >> 16;
116  min = (versionInteger & 0x0000FF00) >> 8;
117  pat = versionInteger & 0x000000FF;
118 }
119 
123 static inline int GetDecimalVersion(int versionInteger)
124 {
125  int maj, min, pat;
126  GetVersionParts(versionInteger, maj, min, pat);
127  return 10000 * maj + 100 * min + pat;
128 }
129 
133 static inline void GetVersionStr(int versionInteger, WDL_String& str)
134 {
135  int maj, min, pat;
136  GetVersionParts(versionInteger, maj, min, pat);
137  str.SetFormatted(MAX_VERSION_STR_LEN, "v%d.%d.%d", maj, min, pat);
138 }
139 
146 template <class SRC, class DEST>
147 void CastCopy(DEST* pDest, SRC* pSrc, int n)
148 {
149  for (int i = 0; i < n; ++i, ++pDest, ++pSrc)
150  {
151  *pDest = (DEST) *pSrc;
152  }
153 }
154 
158 static void ToLower(char* cDest, const char* cSrc)
159 {
160  int i, n = (int) strlen(cSrc);
161  for (i = 0; i < n; ++i)
162  {
163  cDest[i] = tolower(cSrc[i]);
164  }
165  cDest[i] = '\0';
166 }
167 
171 static EHost LookUpHost(const char* inHost)
172 {
173  char host[256];
174  ToLower(host, inHost);
175 
176  // C4 is version >= 8.2
177  if (strstr(host, "reaper")) return kHostReaper;
178  if (strstr(host, "protools")) return kHostProTools;
179  if (strstr(host, "cubase")) return kHostCubase;
180  if (strstr(host, "nuendo")) return kHostNuendo;
181  if (strstr(host, "cakewalk")) return kHostSonar;
182  if (strstr(host, "vegas")) return kHostVegas;
183  if (strstr(host, "fruity")) return kHostFL;
184  if (strstr(host, "samplitude")) return kHostSamplitude;
185  if (strstr(host, "live")) return kHostAbletonLive;
186  if (strstr(host, "tracktion")) return kHostTracktion;
187  if (strstr(host, "ntracks")) return kHostNTracks;
188  if (strstr(host, "melodyne")) return kHostMelodyneStudio;
189  if (strstr(host, "vstmanlib")) return kHostVSTScanner;
190  if (strstr(host, "aulab")) return kHostAULab;
191  if (strstr(host, "forte")) return kHostForte;
192  if (strstr(host, "chainer")) return kHostChainer;
193  if (strstr(host, "audition")) return kHostAudition;
194  if (strstr(host, "orion")) return kHostOrion;
195  if (strstr(host, "bias")) return kHostBias;
196  if (strstr(host, "sawstudio")) return kHostSAWStudio;
197  if (strstr(host, "logic")) return kHostLogic;
198  if (strstr(host, "garageband")) return kHostGarageBand;
199  if (strstr(host, "digital")) return kHostDigitalPerformer;
200  if (strstr(host, "audiomulch")) return kHostAudioMulch;
201  if (strstr(host, "presonus")) return kHostStudioOne;
202  if (strstr(host, "vst3plugintesthost")) return kHostVST3TestHost;
203  if (strstr(host, "ardour")) return kHostArdour;
204  if (strstr(host, "renoise")) return kHostRenoise;
205  if (strstr(host, "openmpt")) return kHostOpenMPT;
206  if (strstr(host, "wavelab elements")) return kHostWaveLabElements; // check for wavelab elements should come before wavelab ...
207  if (strstr(host, "wavelab")) return kHostWaveLab;
208  if (strstr(host, "twistedwave")) return kHostTwistedWave;
209  if (strstr(host, "bitwig studio")) return kHostBitwig;
210  if (strstr(host, "reason")) return kHostReason;
211  if (strstr(host, "gwvst")) return kHostGoldWave5x;
212  if (strstr(host, "waveform")) return kHostWaveform;
213  if (strstr(host, "audacity")) return kHostAudacity;
214  if (strstr(host, "acoustica")) return kHostAcoustica;
215  if (strstr(host, "plugindoctor")) return kHostPluginDoctor;
216  if (strstr(host, "izotope rx")) return kHostiZotopeRX;
217  if (strstr(host, "savihost")) return kHostSAVIHost;
218  if (strstr(host, "blue cat's vst host")) return kHostBlueCat;
219 
220  if (strstr(host, "standalone")) return kHostStandalone;
221  if (strstr(host, "www")) return kHostWWW;
222 
223  return kHostUnknown;
224 
225 }
226 
235 static void GetHostNameStr(EHost host, WDL_String& str)
236 {
237  switch (host)
238  {
239  case kHostReaper: str.Set("reaper"); break;
240  case kHostProTools: str.Set("protools"); break;
241  case kHostCubase: str.Set("cubase"); break;
242  case kHostNuendo: str.Set("nuendo"); break;
243  case kHostSonar: str.Set("cakewalk"); break;
244  case kHostVegas: str.Set("vegas"); break;
245  case kHostFL: str.Set("fruity"); break;
246  case kHostSamplitude: str.Set("samplitude"); break;
247  case kHostAbletonLive: str.Set("live"); break;
248  case kHostTracktion: str.Set("tracktion"); break;
249  case kHostNTracks: str.Set("ntracks"); break;
250  case kHostMelodyneStudio: str.Set("melodyne"); break;
251  case kHostVSTScanner: str.Set("vstmanlib"); break;
252  case kHostAULab: str.Set("aulab"); break;
253  case kHostForte: str.Set("forte"); break;
254  case kHostChainer: str.Set("chainer"); break;
255  case kHostAudition: str.Set("audition"); break;
256  case kHostOrion: str.Set("orion"); break;
257  case kHostBias: str.Set("bias"); break;
258  case kHostSAWStudio: str.Set("sawstudio"); break;
259  case kHostLogic: str.Set("logic"); break;
260  case kHostGarageBand: str.Set("garageband"); break;
261  case kHostDigitalPerformer: str.Set("digital"); break;
262  case kHostAudioMulch: str.Set("audiomulch"); break;
263  case kHostStudioOne: str.Set("presonus"); break;
264  case kHostVST3TestHost: str.Set("vst3plugintesthost"); break;
265  case kHostArdour: str.Set("ardour"); break;
266  case kHostRenoise: str.Set("renoise"); break;
267  case kHostOpenMPT: str.Set("OpenMPT"); break;
268  case kHostWaveLabElements: str.Set("wavelab elements"); break;
269  case kHostWaveLab: str.Set("wavelab"); break;
270  case kHostTwistedWave: str.Set("twistedwave"); break;
271  case kHostBitwig: str.Set("bitwig studio"); break;
272  case kHostReason: str.Set("reason"); break;
273  case kHostGoldWave5x: str.Set("gwvst"); break;
274  case kHostWaveform: str.Set("waveform"); break;
275  case kHostAudacity: str.Set("audacity"); break;
276  case kHostAcoustica: str.Set("acoustica"); break;
277  case kHostPluginDoctor: str.Set("plugindoctor"); break;
278  case kHostiZotopeRX: str.Set("izotope rx"); break;
279  case kHostSAVIHost: str.Set("savihost"); break;
280  case kHostBlueCat: str.Set("blue cat's vst host"); break;
281 
282  case kHostStandalone: str.Set("standalone"); break;
283  case kHostWWW: str.Set("www"); break;
284 
285  default: str.Set("Unknown"); break;
286  }
287 }
288 
294 static void MidiNoteName(double midiPitch, WDL_String& noteName, bool cents = false, bool middleCisC4 = false)
295 {
296  static const char noteNames[12][3] = {"C ","C#","D ","D#","E ","F ","F#","G ","G#","A ","A#","B "};
297 
298  int midiPitchR = (int) std::round(midiPitch);
299  int pitchClass = midiPitchR % 12;
300  int octave = (midiPitchR / 12) - (middleCisC4? 1 : 2);
301 
302  if (cents)
303  {
304  double frac = (midiPitch - (float) midiPitchR) * 100.;
305  noteName.SetFormatted(32, "%s%i %.0f", noteNames[pitchClass], octave, frac);
306  }
307  else
308  {
309  noteName.SetFormatted(32, "%s%i", noteNames[pitchClass], octave);
310  }
311 }
312 
313 END_IPLUG_NAMESPACE
314 
Include to get consistently named preprocessor macros for different platforms and logging functionali...
T Lerp(T a, T b, T f)
Linear interpolate between values a and b.
EHost
Host identifier.
static void MidiNoteName(double midiPitch, WDL_String &noteName, bool cents=false, bool middleCisC4=false)
IPlug Constant definitions, Types, magic numbers.
static const double AMP_DB
Magic number for gain to dB conversion.
static void GetVersionStr(int versionInteger, WDL_String &str)
Helper function to get the semantic version number as a string from an integer.
BEGIN_IPLUG_NAMESPACE T Clip(T x, T lo, T hi)
Clips the value x between lo and hi.
static const double IAMP_DB
Magic number for dB to gain conversion.
static int GetDecimalVersion(int versionInteger)
Helper function to get the version number as a decimal integer.
static double DBToAmp(double dB)
Calculates gain from a given dB value.
void CastCopy(DEST *pDest, SRC *pSrc, int n)
Helper function to loop through a buffer of samples copying and casting from e.g float to double...
static void ToLower(char *cDest, const char *cSrc)
static void GetVersionParts(int versionInteger, int &maj, int &min, int &pat)
Helper function to unpack the version number parts as individual integers.
static EHost LookUpHost(const char *inHost)
Gets the host ID from a human-readable name.
static double AmpToDB(double amp)
static void GetHostNameStr(EHost host, WDL_String &str)
Gets a human-readable name from host identifier.