Skip to content

Commit 6e81d84

Browse files
committed
Ensemble WIP
Co-authored-by: <Marc-Andre Weibezahn> contact@maweibezahn.com
1 parent b33d2c8 commit 6e81d84

File tree

3 files changed

+508
-0
lines changed

3 files changed

+508
-0
lines changed
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
// Copyright AudioKit. All Rights Reserved.
2+
3+
#include "SoundpipeDSPBase.h"
4+
#include "ParameterRamper.h"
5+
#include "Soundpipe.h"
6+
7+
enum EnsembleParameter : AUParameterAddress {
8+
EnsembleParameterShift1,
9+
EnsembleParameterShift2,
10+
EnsembleParameterShift3,
11+
EnsembleParameterShift4,
12+
EnsembleParameterShift5,
13+
EnsembleParameterShift6,
14+
EnsembleParameterShift7,
15+
EnsembleParameterShift8,
16+
EnsembleParameterShift9,
17+
EnsembleParameterPan1,
18+
EnsembleParameterPan2,
19+
EnsembleParameterPan3,
20+
EnsembleParameterPan4,
21+
EnsembleParameterPan5,
22+
EnsembleParameterPan6,
23+
EnsembleParameterPan7,
24+
EnsembleParameterPan8,
25+
EnsembleParameterPan9,
26+
EnsembleParameterDryWetMix
27+
};
28+
29+
class EnsembleDSP : public SoundpipeDSPBase {
30+
private:
31+
// 9 pitch shifters for left channel
32+
sp_pshift *pshift_left[9];
33+
// 9 pitch shifters for right channel
34+
sp_pshift *pshift_right[9];
35+
// 9 panners
36+
sp_panst *panst[9];
37+
38+
ParameterRamper shiftRamps[9];
39+
ParameterRamper panRamps[9];
40+
ParameterRamper dryWetMixRamp;
41+
42+
public:
43+
EnsembleDSP() {
44+
parameters[EnsembleParameterShift1] = &shiftRamps[0];
45+
parameters[EnsembleParameterShift2] = &shiftRamps[1];
46+
parameters[EnsembleParameterShift3] = &shiftRamps[2];
47+
parameters[EnsembleParameterShift4] = &shiftRamps[3];
48+
parameters[EnsembleParameterShift5] = &shiftRamps[4];
49+
parameters[EnsembleParameterShift6] = &shiftRamps[5];
50+
parameters[EnsembleParameterShift7] = &shiftRamps[6];
51+
parameters[EnsembleParameterShift8] = &shiftRamps[7];
52+
parameters[EnsembleParameterShift9] = &shiftRamps[8];
53+
parameters[EnsembleParameterPan1] = &panRamps[0];
54+
parameters[EnsembleParameterPan2] = &panRamps[1];
55+
parameters[EnsembleParameterPan3] = &panRamps[2];
56+
parameters[EnsembleParameterPan4] = &panRamps[3];
57+
parameters[EnsembleParameterPan5] = &panRamps[4];
58+
parameters[EnsembleParameterPan6] = &panRamps[5];
59+
parameters[EnsembleParameterPan7] = &panRamps[6];
60+
parameters[EnsembleParameterPan8] = &panRamps[7];
61+
parameters[EnsembleParameterPan9] = &panRamps[8];
62+
parameters[EnsembleParameterDryWetMix] = &dryWetMixRamp;
63+
}
64+
65+
void init(int channelCount, double sampleRate) override {
66+
SoundpipeDSPBase::init(channelCount, sampleRate);
67+
68+
// Initialize pitch shifters and panners
69+
for (int i = 0; i < 9; i++) {
70+
// Left channel pitch shifters
71+
sp_pshift_create(&pshift_left[i]);
72+
sp_pshift_init(sp, pshift_left[i]);
73+
74+
// Right channel pitch shifters
75+
sp_pshift_create(&pshift_right[i]);
76+
sp_pshift_init(sp, pshift_right[i]);
77+
78+
// Panners
79+
sp_panst_create(&panst[i]);
80+
sp_panst_init(sp, panst[i]);
81+
}
82+
}
83+
84+
void deinit() override {
85+
SoundpipeDSPBase::deinit();
86+
87+
for (int i = 0; i < 9; i++) {
88+
sp_pshift_destroy(&pshift_left[i]);
89+
sp_pshift_destroy(&pshift_right[i]);
90+
sp_panst_destroy(&panst[i]);
91+
}
92+
}
93+
94+
void reset() override {
95+
SoundpipeDSPBase::reset();
96+
if (!isInitialized) return;
97+
98+
// Reset all pitch shifters and panners
99+
for (int i = 0; i < 9; i++) {
100+
void *old_left = pshift_left[i]->faust;
101+
void *old_right = pshift_right[i]->faust;
102+
103+
sp_pshift_init(sp, pshift_left[i]);
104+
sp_pshift_init(sp, pshift_right[i]);
105+
sp_panst_init(sp, panst[i]);
106+
107+
free(old_left);
108+
free(old_right);
109+
}
110+
}
111+
112+
void process(FrameRange range) override {
113+
for (int i : range) {
114+
float dryWetMix = dryWetMixRamp.getAndStep();
115+
116+
float leftIn = inputSample(0, i);
117+
float rightIn = inputSample(1, i);
118+
119+
float leftSum = 0.0f;
120+
float rightSum = 0.0f;
121+
122+
// Process through all 9 pitch shifters
123+
for (int voice = 0; voice < 9; voice++) {
124+
float shift = shiftRamps[voice].getAndStep();
125+
float pan = panRamps[voice].getAndStep();
126+
127+
// Set pitch shift parameters
128+
*pshift_left[voice]->shift = *pshift_right[voice]->shift = shift;
129+
*pshift_left[voice]->window = *pshift_right[voice]->window = 1024;
130+
*pshift_left[voice]->xfade = *pshift_right[voice]->xfade = 512;
131+
132+
// Process audio through pitch shifters
133+
float leftOut, rightOut;
134+
sp_pshift_compute(sp, pshift_left[voice], &leftIn, &leftOut);
135+
sp_pshift_compute(sp, pshift_right[voice], &rightIn, &rightOut);
136+
137+
// Set pan parameter and apply panning
138+
panst[voice]->pan = pan;
139+
float pannedLeft, pannedRight;
140+
sp_panst_compute(sp, panst[voice], &leftOut, &rightOut, &pannedLeft, &pannedRight);
141+
142+
// Add to sum with appropriate gain (divide by 9 to prevent clipping)
143+
leftSum += pannedLeft / 9.0f;
144+
rightSum += pannedRight / 9.0f;
145+
}
146+
147+
// Apply dry/wet mix
148+
outputSample(0, i) = dryWetMix * leftSum + (1.0f - dryWetMix) * leftIn;
149+
outputSample(1, i) = dryWetMix * rightSum + (1.0f - dryWetMix) * rightIn;
150+
}
151+
}
152+
};
153+
154+
AK_REGISTER_DSP(EnsembleDSP, "ensm")
155+
AK_REGISTER_PARAMETER(EnsembleParameterShift1)
156+
AK_REGISTER_PARAMETER(EnsembleParameterShift2)
157+
AK_REGISTER_PARAMETER(EnsembleParameterShift3)
158+
AK_REGISTER_PARAMETER(EnsembleParameterShift4)
159+
AK_REGISTER_PARAMETER(EnsembleParameterShift5)
160+
AK_REGISTER_PARAMETER(EnsembleParameterShift6)
161+
AK_REGISTER_PARAMETER(EnsembleParameterShift7)
162+
AK_REGISTER_PARAMETER(EnsembleParameterShift8)
163+
AK_REGISTER_PARAMETER(EnsembleParameterShift9)
164+
AK_REGISTER_PARAMETER(EnsembleParameterPan1)
165+
AK_REGISTER_PARAMETER(EnsembleParameterPan2)
166+
AK_REGISTER_PARAMETER(EnsembleParameterPan3)
167+
AK_REGISTER_PARAMETER(EnsembleParameterPan4)
168+
AK_REGISTER_PARAMETER(EnsembleParameterPan5)
169+
AK_REGISTER_PARAMETER(EnsembleParameterPan6)
170+
AK_REGISTER_PARAMETER(EnsembleParameterPan7)
171+
AK_REGISTER_PARAMETER(EnsembleParameterPan8)
172+
AK_REGISTER_PARAMETER(EnsembleParameterPan9)
173+
AK_REGISTER_PARAMETER(EnsembleParameterDryWetMix)

0 commit comments

Comments
 (0)