-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwaveProcessor.cpp
More file actions
115 lines (104 loc) · 4.43 KB
/
Copy pathwaveProcessor.cpp
File metadata and controls
115 lines (104 loc) · 4.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "waveProcessor.h"
#include "IPlug_include_in_plug_src.h"
#include "IControls.h"
#define GETPARAMS(i) GetParam(kPreGain##i)->InitDouble("Pre Gain", 100., 0., 1000.0, 0.01, "%"); \
GetParam(kPostGain##i)->InitDouble("Post Gain", 100., 0., 400.0, 0.01, "%"); \
GetParam(kWaveType##i)->InitEnum("Wave Type", TANH, 12); \
GetParam(kWaveType##i)->SetDisplayText(0, "Arctan"); \
GetParam(kWaveType##i)->SetDisplayText(1, "TANH"); \
GetParam(kWaveType##i)->SetDisplayText(2, "TANH^3"); \
GetParam(kWaveType##i)->SetDisplayText(3, "SIN"); \
GetParam(kWaveType##i)->SetDisplayText(4, "SIN^3"); \
GetParam(kWaveType##i)->SetDisplayText(5, "SIGMOID"); \
GetParam(kWaveType##i)->SetDisplayText(6, "TANH(TAN)"); \
GetParam(kWaveType##i)->SetDisplayText(7, "TANH(TAN^3)"); \
GetParam(kWaveType##i)->SetDisplayText(8, "TANH(EXP)"); \
GetParam(kWaveType##i)->SetDisplayText(9, "SIN(TAN)"); \
GetParam(kWaveType##i)->SetDisplayText(10, "SIN(TAN^3)"); \
GetParam(kWaveType##i)->SetDisplayText(11, "SIN(EXP)"); \
GetParam(kMix##i)->InitDouble("Mix", 50., 0., 100.0, 0.01, "%");
#define CONNECTGRAPHICS(x, y) \
pGraphics->AttachControl(new IVKnobControl(b.GetCentredInside(100) .GetHShifted(-160).GetVShifted(y), kPreGain##x)); \
pGraphics->AttachControl(new IVMenuButtonControl(b.GetCentredInside(100).GetHShifted(-60) .GetVShifted(y), kWaveType##x, "Wave Type")); \
pGraphics->AttachControl(new IVKnobControl(b.GetCentredInside(100) .GetHShifted(40) .GetVShifted(y), kPostGain##x)); \
pGraphics->AttachControl(new VuMeterControl(b.GetCentredInside(100) .GetHShifted(100) .GetVShifted(y).GetVPadded(-5).GetHPadded(-45), COLOR_BLACK, kCtrlTagVUMeter##x), kCtrlTagVUMeter##x); \
pGraphics->AttachControl(new IVKnobControl(b.GetCentredInside(100) .GetHShifted(160) .GetVShifted(y), kMix##x)); \
waveProcessor::waveProcessor(const InstanceInfo& info)
: iplug::Plugin(info, MakeConfig(kNumParams, kNumPresets))
{
GETPARAMS(0);
GETPARAMS(1);
GETPARAMS(2);
GetParam(kParallel)->InitBool("Parallel", false);
#if IPLUG_EDITOR // http://bit.ly/2S64BDd
mMakeGraphicsFunc = [&]() {
return MakeGraphics(*this, PLUG_WIDTH, PLUG_HEIGHT, PLUG_FPS, GetScaleForScreen(PLUG_WIDTH, PLUG_HEIGHT));
};
mLayoutFunc = [&](IGraphics* pGraphics) {
pGraphics->AttachCornerResizer(EUIResizerMode::Scale, false);
pGraphics->AttachPanelBackground(COLOR_GRAY);
pGraphics->LoadFont("Roboto-Regular", ROBOTO_FN);
const IRECT b = pGraphics->GetBounds();
pGraphics->AttachControl(new IVToggleControl(b.GetCentredInside(50).GetVShifted(-175), kParallel, "Parallel"));
CONNECTGRAPHICS(0, -100);
CONNECTGRAPHICS(1, 0);
CONNECTGRAPHICS(2, 100);
};
#endif
}
void waveProcessor::OnIdle() {
SendControlValueFromDelegate(kCtrlTagVUMeter0, mVuMeters[0]->Voltage.load());
SendControlValueFromDelegate(kCtrlTagVUMeter1, mVuMeters[1]->Voltage.load());
SendControlValueFromDelegate(kCtrlTagVUMeter2, mVuMeters[2]->Voltage.load());
}
#define WAVETYPE(i) static_cast<waveform>(GetParam(kWaveType##i)->Int())
#define INITSHAPER(i) mShaper[i].init(GetParam(kPreGain##i), GetParam(kPostGain##i), WAVETYPE(i), GetParam(kMix##i));
#if IPLUG_DSP
void waveProcessor::ProcessBlock(sample** inputs, sample** outputs, int nFrames)
{
INITSHAPER(0);
INITSHAPER(1);
INITSHAPER(2);
const int nChans = NOutChansConnected();
iplug::sample temp = 0.0;
iplug::sample temp2 = 0.0;
iplug::sample temp3 = 0.0;
if (!GetParam(kParallel)->Value())
{
for (int s = 0; s < nFrames; s++)
{
for (int c = 0; c < nChans; c++)
{
temp = inputs[c][s];
temp = mShaper[0].process(temp);
mVuMeters[0]->process(temp);
temp = mShaper[1].process(temp);
mVuMeters[1]->process(temp);
temp = mShaper[2].process(temp);
mVuMeters[2]->process(temp);
outputs[c][s] = temp;
}
}
}
else {
for (int s = 0; s < nFrames; s++)
{
for (int c = 0; c < nChans; c++)
{
temp = inputs[c][s];
temp2 = mShaper[1].process(temp);
mVuMeters[1]->process(temp2);
temp3 = mShaper[2].process(temp);
mVuMeters[2]->process(temp3);
temp = mShaper[0].process(temp);
mVuMeters[0]->process(temp);
temp = (temp + temp2 + temp3) / 3.;
outputs[c][s] = temp;
}
}
}
mVuMeters[0]->store();
mVuMeters[1]->store();
mVuMeters[2]->store();
}
#endif