1
1
#include " PolyOctave.h"
2
- #include " PolyOctaveFilterBandHelpers.h"
2
+ #include " PolyOctaveV1FilterBankImpl.h"
3
+ #include " PolyOctaveV2FilterBankImpl.h"
3
4
#include " processors/ParameterHelpers.h"
4
5
5
6
namespace PolyOctaveTags
@@ -13,11 +14,11 @@ const String v1Tag = "v1_mode";
13
14
14
15
PolyOctave::PolyOctave (UndoManager* um)
15
16
: BaseProcessor (
16
- " Poly Octave" ,
17
- createParameterLayout (),
18
- BasicInputPort {},
19
- OutputPort {},
20
- um)
17
+ " Poly Octave" ,
18
+ createParameterLayout (),
19
+ BasicInputPort {},
20
+ OutputPort {},
21
+ um)
21
22
{
22
23
using namespace ParameterHelpers ;
23
24
const auto setupGainParam = [this ] (const juce::String& paramID,
@@ -42,6 +43,14 @@ PolyOctave::PolyOctave (UndoManager* um)
42
43
uiOptions.powerColour = Colour { 0xffe70510 };
43
44
uiOptions.info .description = " A \" polyphonic octave generator\" effect." ;
44
45
uiOptions.info .authors = StringArray { " Jatin Chowdhury" };
46
+
47
+ #if JUCE_INTEL
48
+ if (juce::SystemStats::hasAVX () && juce::SystemStats::hasFMA3 ())
49
+ {
50
+ juce::Logger::writeToLog (" Using Poly Octave with AVX SIMD instructions!" );
51
+ use_avx = true ;
52
+ }
53
+ #endif
45
54
}
46
55
47
56
ParamLayout PolyOctave::createParameterLayout ()
@@ -94,9 +103,9 @@ void PolyOctave::prepare (double sampleRate, int samplesPerBlock)
94
103
}
95
104
96
105
mixOutBuffer.setSize (2 , samplesPerBlock);
97
- up1OutBuffer.setSize (2 , 4 * samplesPerBlock + 8 ); // padding for SIMD
98
- up2OutBuffer.setSize (2 , 4 * samplesPerBlock + 8 ); // padding for SIMD
99
- down1OutBuffer.setSize (2 , 4 * samplesPerBlock + 8 ); // padding for SIMD
106
+ up1OutBuffer.setSize (2 , 8 * samplesPerBlock + 32 ); // padding for SIMD
107
+ up2OutBuffer.setSize (2 , 8 * samplesPerBlock + 32 ); // padding for SIMD
108
+ down1OutBuffer.setSize (2 , samplesPerBlock);
100
109
}
101
110
102
111
void PolyOctave::processAudio (AudioBuffer<float >& buffer)
@@ -127,21 +136,45 @@ void PolyOctave::processAudio (AudioBuffer<float>& buffer)
127
136
// "up1" processing
128
137
for (auto [ch, data_in, data_out] : chowdsp::buffer_iters::zip_channels (std::as_const (buffer), up1OutBuffer))
129
138
{
130
- poly_octave_v2::process<1 > (octaveUpFilterBank[ch],
131
- data_in.data (),
132
- data_out.data (),
133
- numSamples);
139
+ #if JUCE_INTEL
140
+ if (use_avx)
141
+ {
142
+ poly_octave_v2::process_avx<1 > (octaveUpFilterBank[ch],
143
+ data_in.data (),
144
+ data_out.data (),
145
+ numSamples);
146
+ }
147
+ else
148
+ #endif
149
+ {
150
+ poly_octave_v2::process<1 > (octaveUpFilterBank[ch],
151
+ data_in.data (),
152
+ data_out.data (),
153
+ numSamples);
154
+ }
134
155
}
135
156
upOctaveGain.process (numSamples);
136
157
chowdsp::BufferMath::applyGainSmoothedBuffer (up1OutBuffer, upOctaveGain);
137
158
138
159
// "up2" processing
139
160
for (auto [ch, data_in, data_out] : chowdsp::buffer_iters::zip_channels (std::as_const (buffer), up2OutBuffer))
140
161
{
141
- poly_octave_v2::process<2 > (octaveUp2FilterBank[ch],
142
- data_in.data (),
143
- data_out.data (),
144
- numSamples);
162
+ #if JUCE_INTEL
163
+ if (use_avx)
164
+ {
165
+ poly_octave_v2::process_avx<2 > (octaveUp2FilterBank[ch],
166
+ data_in.data (),
167
+ data_out.data (),
168
+ numSamples);
169
+ }
170
+ else
171
+ #endif
172
+ {
173
+ poly_octave_v2::process<2 > (octaveUp2FilterBank[ch],
174
+ data_in.data (),
175
+ data_out.data (),
176
+ numSamples);
177
+ }
145
178
}
146
179
up2OctaveGain.process (numSamples);
147
180
chowdsp::BufferMath::applyGainSmoothedBuffer (up2OutBuffer, up2OctaveGain);
0 commit comments