Skip to content

Commit c195fc1

Browse files
committed
BUGFIX
1 parent f5bbf76 commit c195fc1

4 files changed

Lines changed: 34 additions & 62 deletions

File tree

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
"valarray": "cpp",
101101
"iterativelinearsolvers": "cpp",
102102
"sparse": "cpp",
103-
"alignedvector3": "cpp"
103+
"alignedvector3": "cpp",
104+
"sparselu": "cpp"
104105
}
105106
}

plugin/include/Bifractalizer/PluginProcessor.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
#include <Eigen/Sparse>
55
#include <Eigen/SparseLU>
66

7-
//using FloatSolver = Eigen::SparseLU<Eigen::SparseMatrix<float>>;
8-
using FloatSolver = Eigen::BiCGSTAB<Eigen::SparseMatrix<float>>;
7+
using FloatSolver = Eigen::SparseLU<Eigen::SparseMatrix<float>>;
8+
//using FloatSolver = Eigen::BiCGSTAB<Eigen::SparseMatrix<float>>;
99

1010

1111
namespace audio_plugin {
@@ -70,6 +70,8 @@ class AudioPluginAudioProcessor : public juce::AudioProcessor {
7070
bool actualDefrMatrix = false;
7171
Eigen::SparseMatrix<float> defrMatrix;
7272
FloatSolver defrSolver;
73+
juce::ThreadPool threadPool;
74+
std::atomic<bool> solverReady{true};
7375
void prepareDefractalizer();
7476
// -~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~-~-~-~-
7577

plugin/source/PluginProcessor.cpp

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,10 @@ void AudioPluginAudioProcessor::updateBuffers(int hostBlockSize) {
147147
blockSizeVal) + (hostBlockSize % blockSizeVal == 0 ? 0 : 1)) * blockSizeVal + inBufPos;
148148

149149
int numChannels = getTotalNumInputChannels();
150-
inputBuffer.setSize(numChannels, blockSizeVal, false, true, true);
151-
outputBuffer.setSize(numChannels, outBufSize, false, true, true);
150+
inputBuffer.setSize(numChannels, blockSizeVal);
151+
inputBuffer.clear();
152+
outputBuffer.setSize(numChannels, outBufSize);
153+
outputBuffer.clear();
152154

153155
outBufPosRead = 0;
154156
if (hostBlockSize % (outBufSize - inBufPos) == 0)
@@ -191,6 +193,7 @@ void AudioPluginAudioProcessor::prepareToPlay(double sampleRate,
191193
outBufPosRead = 0; // for audio repeatability
192194
outputBuffer.clear(); // for audio repeatability
193195
prevBlockOffset = -1; // so inBufPos will be changed
196+
processingN = -1;
194197
updateBuffers(samplesPerBlock);
195198
}
196199

@@ -354,10 +357,15 @@ void AudioPluginAudioProcessor::processBlock(juce::AudioBuffer<float>& buffer,
354357
void AudioPluginAudioProcessor::prepareDefractalizer() {
355358
findDefractalizerMatrix(defrMatrix, two_pow_n, weights, processingN, max_terms);
356359

357-
//defrSolver.analyzePattern(defrMatrix);
358-
//defrSolver.factorize(defrMatrix);
359-
defrSolver.setMaxIterations(50);
360-
defrSolver.compute(defrMatrix);
360+
solverReady.store(false);
361+
threadPool.addJob([this] {
362+
defrSolver.analyzePattern(defrMatrix);
363+
defrSolver.factorize(defrMatrix);
364+
solverReady.store(true);
365+
});
366+
367+
//defrSolver.setMaxIterations(max_terms*2);
368+
//defrSolver.compute(defrMatrix);
361369
actualDefrMatrix = true;
362370
}
363371

@@ -376,10 +384,16 @@ void AudioPluginAudioProcessor::processCustomBlock() {
376384
if (apvts.getRawParameterValue("mode")->load()==0) {
377385
fractalize(xGrid, processInBuffer, processOutBuffer, two_pow_n, weights, max_terms);
378386
} else {
379-
if (!actualDefrMatrix) {
387+
if (!actualDefrMatrix && solverReady) {
380388
prepareDefractalizer();
381389
}
382390
defractalize(processInBuffer, processOutBuffer, defrMatrix, defrSolver);
391+
defractalize(processInBuffer, processOutBuffer, defrMatrix, defrSolver);
392+
} else {
393+
for (int ch = 0; ch < getNumInputChannels(); ++ch) {
394+
processOutBuffer.copyFrom(ch, 0, processInBuffer, ch, 0, processingN);
395+
}
396+
}
383397
}
384398
}
385399

plugin/source/bifractalizer.cpp

Lines changed: 7 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
#include <Eigen/Sparse>
1414
#include <Eigen/IterativeLinearSolvers>
1515

16-
//using FloatSolver = Eigen::SparseLU<Eigen::SparseMatrix<float>>;
17-
using FloatSolver = Eigen::BiCGSTAB<Eigen::SparseMatrix<float>>;
16+
using FloatSolver = Eigen::SparseLU<Eigen::SparseMatrix<float>>;
17+
//using FloatSolver = Eigen::BiCGSTAB<Eigen::SparseMatrix<float>>;
1818

1919

2020
namespace audio_plugin {
@@ -34,7 +34,7 @@ void compute_f_optimized(juce::AudioBuffer<float>& f, // size(f) == size(
3434
const juce::AudioBuffer<float>& g, // size(f) == size(x) == size(g)
3535
const std::vector<float>& two_pow_n, // size(two_pow_n) == max_terms
3636
const std::vector<float>& weights, // size(weights) == max_terms
37-
int max_terms = 20 /* Must be divisible by 4!*/) {
37+
int max_terms = 20) {
3838
const int N = g.getNumSamples();
3939
const int numChannels = f.getNumChannels();
4040
const float inv_g_step = static_cast<float>(N);
@@ -48,62 +48,17 @@ void compute_f_optimized(juce::AudioBuffer<float>& f, // size(f) == size(
4848
const float xi = x_data[i];
4949
float sum = 0.0f;
5050

51-
for (int n = 0; n < max_terms; n += 4) {
52-
const float arg0 = xi * two_pow_n[n];
53-
const float arg1 = xi * two_pow_n[n+1];
54-
const float arg2 = xi * two_pow_n[n+2];
55-
const float arg3 = xi * two_pow_n[n+3];
56-
57-
const int idx0 = static_cast<int>((arg0 - std::floor(arg0)) * inv_g_step + 0.5f);
58-
const int idx1 = static_cast<int>((arg1 - std::floor(arg1)) * inv_g_step + 0.5f);
59-
const int idx2 = static_cast<int>((arg2 - std::floor(arg2)) * inv_g_step + 0.5f);
60-
const int idx3 = static_cast<int>((arg3 - std::floor(arg3)) * inv_g_step + 0.5f);
61-
62-
sum += weights[n] * g_data[idx0];
63-
sum += weights[n+1] * g_data[idx1];
64-
sum += weights[n+2] * g_data[idx2];
65-
sum += weights[n+3] * g_data[idx3];
66-
}
67-
68-
f_data[i] = sum;
69-
}
70-
}
71-
}
72-
73-
74-
/*void compute_f(juce::AudioBuffer<float>& f,
75-
const std::vector<float>& x,
76-
const juce::AudioBuffer<float>& g,
77-
const std::vector<float>& two_pow_n,
78-
const std::vector<float>& weights,
79-
int max_terms = 20) {
80-
const int N = g.getNumSamples();
81-
const int numChannels = f.getNumChannels();
82-
83-
const float inv_g_step = static_cast<float>(N);
84-
const float* x_data = x.data();
85-
86-
for (int ch = 0; ch < numChannels; ++ch) {
87-
const float* g_data = g.getReadPointer(ch);
88-
float* f_data = f.getWritePointer(ch);
89-
90-
for (int i = 0; i < N; ++i) {
91-
float sum = 0.0f;
92-
const float xi = x_data[i];
93-
9451
for (int n = 0; n < max_terms; ++n) {
9552
const float arg = xi * two_pow_n[n];
96-
const float fractional = arg - std::floor(arg);
97-
const int idx = static_cast<int>(fractional * inv_g_step + 0.5f);
98-
//const int safe_idx = idx < N ? idx : N - 1;
99-
100-
sum += weights[n] * g_data[idx];
53+
const int idx = static_cast<int>((arg - std::floor(arg)) * inv_g_step + 0.5f);
54+
const int safe_idx = idx < N ? idx : N - 1;
55+
sum += weights[n] * g_data[safe_idx];
10156
}
10257

10358
f_data[i] = sum;
10459
}
10560
}
106-
}*/
61+
}
10762

10863

10964
void fractalize(const std::vector<float> &x_grid,

0 commit comments

Comments
 (0)