fix pbxprojs
[wdl/wdl-ol.git] / IPlugExamples / IPlugChunks / IPlugChunks.cpp
blob1ad3ccdcc97386fd79944f59c2dfbf90283021a5
1 #include "IPlugChunks.h"
2 #include "IPlug_include_in_plug_src.h"
3 #include "IControl.h"
4 #include "resource.h"
5 #include <math.h>
7 // The number of presets/programs
8 const int kNumPrograms = 8;
10 // An enumerated list for all the parameters of the plugin
11 enum EParams
13 kGain = 0,
14 kNumParams, // the last element is used to store the total number of parameters
17 const int kDummyParamForMultislider = -2;
19 enum ELayout
21 kW = 400,
22 kH = 300
25 class ITempPresetSaveButtonControl : public IPanelControl
27 public:
28 ITempPresetSaveButtonControl(IPlugBase *pPlug, IRECT pR)
29 : IPanelControl(pPlug, pR, &COLOR_RED) {}
31 void OnMouseDown(int x, int y, IMouseMod* pMod)
33 WDL_String presetFilePath;
34 mPlug->GetGUI()->DesktopPath(&presetFilePath);
35 #ifdef OS_WIN
36 presetFilePath.Append("\\IPlugChunksPreset.txt");
37 #else //OSX
38 presetFilePath.Append("IPlugChunksPreset.txt");
39 #endif
40 mPlug->DumpPresetBlob(presetFilePath.Get());
45 class PresetFunctionsMenu : public IPanelControl
47 public:
48 PresetFunctionsMenu(IPlugBase *pPlug, IRECT pR)
49 : IPanelControl(pPlug, pR, &COLOR_BLUE)
52 bool Draw(IGraphics* pGraphics)
54 pGraphics->FillIRect(&COLOR_WHITE, &mRECT);
56 int ax = mRECT.R - 8;
57 int ay = mRECT.T + 4;
58 int bx = ax + 4;
59 int by = ay;
60 int cx = ax + 2;
61 int cy = ay + 2;
63 pGraphics->FillTriangle(&COLOR_GRAY, ax , ay, bx, by, cx, cy, &mBlend);
65 return true;
68 void OnMouseDown(int x, int y, IMouseMod* pMod)
70 if (pMod->L)
72 doPopupMenu();
75 Redraw(); // seems to need this
76 SetDirty();
79 void doPopupMenu()
81 IPopupMenu menu;
83 IGraphics* gui = mPlug->GetGUI();
85 menu.AddItem("Save Program...");
86 menu.AddItem("Save Bank...");
87 menu.AddSeparator();
88 menu.AddItem("Load Program...");
89 menu.AddItem("Load Bank...");
91 if(gui->CreateIPopupMenu(&menu, &mRECT))
93 int itemChosen = menu.GetChosenItemIdx();
95 //printf("chosen %i /n", itemChosen);
96 switch (itemChosen)
98 case 0: //Save Program
99 char disp[MAX_PRESET_NAME_LEN];
100 strcpy(disp, mPlug->GetPresetName(mPlug->GetCurrentPresetIdx()));
101 mPlug->SaveProgramAsFXP(disp);
102 break;
103 case 1: //Save Bank
104 mPlug->SaveBankAsFXB("IPlugChunks Bank");
105 break;
106 case 3: //Load Preset
107 mPlug->LoadProgramFromFXP();
108 break;
109 case 4: // Load Bank
110 mPlug->LoadBankFromFXB();
111 break;
112 default:
113 break;
119 IPlugChunks::IPlugChunks(IPlugInstanceInfo instanceInfo)
120 : IPLUG_CTOR(kNumParams, kNumPrograms, instanceInfo), mGain(1.)
122 TRACE;
124 memset(mSteps, 0, NUM_SLIDERS*sizeof(double));
126 // Define parameter ranges, display units, labels.
127 //arguments are: name, defaultVal, minVal, maxVal, step, label
128 GetParam(kGain)->InitDouble("Gain", 0.0, -70.0, 12.0, 0.1, "dB");
130 MakePresetFromBlob("Ramp Up", "AAAAAJqZqT8AAAAAmpm5PwAAAIA9Csc/AAAAAAAA0D8AAABA4XrUPwAAAIDC9dg/AAAAwMzM3D8AAAAQ16PgPwAAALBH4eI/AAAA0MzM5D8AAADwUbjmPwAAAAjXo+g/AAAAKFyP6j8AAADMzMzsPwAAAOxRuO4/AAAAAAAA8D8AAAAAAAC8Pg==", 136);
131 MakePresetFromBlob("Ramp Down", "AAAA7FG47j8AAABI4XrsPwAAALBH4eo/AAAAGK5H6T8AAABwPQrnPwAAANDMzOQ/AAAAwB6F4z8AAAAghevhPwAAAAB7FN4/AAAAgOtR2D8AAABAuB7VPwAAAACuR9E/AAAAgEfhyj8AAAAAhevBPwAAAABSuK4/AAAAAOB6hD8AAAAAAAC8Pg==", 136);
132 MakePresetFromBlob("Triangle", "AAAAAIXrwT8AAACAR+HKPwAAAEBcj9I/AAAAgBSu1z8AAADA9SjcPwAAABDXo+A/AAAAsEfh4j8AAABQuB7lPwAAAGBmZuY/AAAAMDMz4z8AAAAAAADgPwAAAMD1KNw/AAAAQI/C1T8AAAAArkfRPwAAAICPwsU/AAAAAJqZuT8AAAAAAAAAAA==", 136);
133 MakePresetFromBlob("Inv Triangle", "AAAAAAAA8D8AAABQuB7tPwAAAKBwPeo/AAAAcD0K5z8AAABA4XrkPwAAAJDC9eA/AAAAwEfh2j8AAABAj8LVPwAAAECPwtU/AAAAwMzM3D8AAAAghevhPwAAANDMzOQ/AAAAgBSu5z8AAACYmZnpPwAAAFyPwu0/AAAAAAAA8D8AAAAAAAAAAA==", 136);
134 MakePresetFromBlob("Da Endz", "AAAAAAAA8D8AAAAA4HqEPwAAAADgeoQ/AAAAAOB6hD8AAAAA4HqEPwAAAADgeoQ/AAAAAOB6hD8AAAAA4HqEPwAAAADgeoQ/AAAAAOB6hD8AAAAA4HqEPwAAAADgeoQ/AAAAAOB6hD8AAAAA4HqEPwAAAADgeoQ/AAAAAAAA8D8AAAAAAAAAAA==", 136);
135 MakePresetFromBlob("Alternate", "AAAAAAAA8D8AAAAA4HqEPwAAAAAAAPA/AAAAAOB6hD8AAAAAAADwPwAAAADgeoQ/AAAAAAAA8D8AAAAA4HqEPwAAAAAAAPA/AAAAAOB6hD8AAAAAAADwPwAAAADgeoQ/AAAAAAAA8D8AAAAA4HqEPwAAAAAAAPA/AAAAAOB6hD8AAAAAAAAAAA==", 136);
136 MakePresetFromBlob("Alt Ramp Down", "AAAAAAAA8D8AAAAA4HqEPwAAALgehes/AAAAAOB6hD8AAACI61HoPwAAAADgeoQ/AAAAQArX4z8AAAAA4HqEPwAAAAAAAOA/AAAAAOB6hD8AAABAuB7VPwAAAADgeoQ/AAAAAKRwzT8AAAAA4HqEPwAAAAAzM8M/AAAAAOB6hD8AAAAAAAAAAA==", 136);
137 MakePresetFromBlob("Alt Ramp Up", "AAAAgJmZyT8AAAAA4HqEPwAAAIBmZtY/AAAAAOB6hD8AAAAAKVzfPwAAAADgeoQ/AAAAMFyP4j8AAAAA4HqEPwAAAEDheuQ/AAAAAOB6hD8AAADwKFznPwAAAADgeoQ/AAAAIIXr6T8AAAAA4HqEPwAAANijcO0/AAAAAOB6hD8AAAAAAAAAAA==", 136);
139 IGraphics* pGraphics = MakeGraphics(this, kW, kH);
140 pGraphics->AttachPanelBackground(&COLOR_BLUE);
142 mMSlider = new MultiSliderControlV(this, IRECT(10, 10, 170, 110), kDummyParamForMultislider, NUM_SLIDERS, 10, &COLOR_WHITE, &COLOR_BLACK, &COLOR_RED);
144 pGraphics->AttachControl(mMSlider);
145 pGraphics->AttachControl(new IVSliderControl(this, IRECT(200, 10, 220, 110), kGain, 20, &COLOR_WHITE, &COLOR_GREEN));
147 //pGraphics->AttachControl(new ITempPresetSaveButtonControl(this, IRECT(350, 250, 390, 290)));
148 pGraphics->AttachControl(new PresetFunctionsMenu(this, IRECT(350, 250, 390, 290)));
150 AttachGraphics(pGraphics);
152 // call RestorePreset(0) here which will initialize the multislider in the gui and the mSteps array
153 RestorePreset(0);
156 IPlugChunks::~IPlugChunks() {}
158 void IPlugChunks::ProcessDoubleReplacing(double** inputs, double** outputs, int nFrames)
160 // Mutex is already locked for us.
162 double* in1 = inputs[0];
163 double* in2 = inputs[1];
164 double* out1 = outputs[0];
165 double* out2 = outputs[1];
167 int samplesPerBeat = (int) GetSamplesPerBeat();
168 int samplePos = (int) GetSamplePos();
170 int count = mCount;
171 int prevcount = mPrevCount;
173 for (int s = 0; s < nFrames; ++s, ++in1, ++in2, ++out1, ++out2)
175 int mod = (samplePos + s) % (samplesPerBeat * BEAT_DIV);
177 count = mod / (samplesPerBeat / BEAT_DIV);
179 if (count >= NUM_SLIDERS)
181 count = 0;
184 if (count != prevcount)
186 if (GetGUI())
188 mMSlider->SetHighlight(count);
192 prevcount = count;
194 *out1 = *in1 * mSteps[count] * mGain;
195 *out2 = *in2 * mSteps[count] * mGain;
198 mCount = count;
199 mPrevCount = prevcount;
203 void IPlugChunks::Reset()
205 TRACE;
206 IMutexLock lock(this);
208 mCount = 0;
209 mPrevCount = ULONG_MAX;
212 void IPlugChunks::OnParamChange(int paramIdx)
214 TRACE;
216 IMutexLock lock(this);
218 switch (paramIdx)
220 case kDummyParamForMultislider:
221 mMSlider->GetLatestChange(mSteps);
222 break;
223 case kGain:
224 mGain = GetParam(kGain)->DBToAmp();
225 break;
226 default:
227 break;
231 // this over-ridden method is called when the host is trying to store the plug-in state and needs to get the current data from your algorithm
232 bool IPlugChunks::SerializeState(ByteChunk* pChunk)
234 TRACE;
235 IMutexLock lock(this);
236 double v;
238 // serialize the multi-slider state state before serializing the regular params
239 for (int i = 0; i< NUM_SLIDERS; i++)
241 v = mSteps[i];
242 pChunk->Put(&v);
245 return IPlugBase::SerializeParams(pChunk); // must remember to call SerializeParams at the end
248 // this over-ridden method is called when the host is trying to load the plug-in state and you need to unpack the data into your algorithm
249 int IPlugChunks::UnserializeState(ByteChunk* pChunk, int startPos)
251 TRACE;
252 IMutexLock lock(this);
253 double v = 0.0;
255 // unserialize the multi-slider state before unserializing the regular params
256 for (int i = 0; i< NUM_SLIDERS; i++)
258 v = 0.0;
259 startPos = pChunk->Get(&v, startPos);
260 mSteps[i] = v;
263 // update values in control, will set dirty
264 if(mMSlider)
265 mMSlider->SetState(mSteps);
267 return IPlugBase::UnserializeParams(pChunk, startPos); // must remember to call UnserializeParams at the end
270 bool IPlugChunks::CompareState(const unsigned char* incomingState, int startPos)
272 bool isEqual = true;
273 const double* data = (const double*) incomingState;
274 startPos = NUM_SLIDERS * sizeof(double);
275 isEqual = (memcmp(data, mSteps, startPos) == 0);
276 isEqual &= IPlugBase::CompareState(incomingState, startPos); // fuzzy compare regular params
278 return isEqual;
281 void IPlugChunks::PresetsChangedByHost()
283 TRACE;
284 IMutexLock lock(this);
286 if(mMSlider)
287 mMSlider->SetState(mSteps);
289 if(GetGUI())
290 GetGUI()->SetAllControlsDirty();