- refactored Diffusor, Delay into separate files
This commit is contained in:
2025-11-15 15:37:33 +01:00
parent 910170e8dc
commit 57d755a531
+3 -168
View File
@@ -2,183 +2,18 @@
#define REVERB_H
#include <cstdlib>
#include <delay/buffer_multi.hpp>
#include <common/mix.hpp>
#include <initializer_list>
#include <sys/types.h>
#include <iostream>
#include "diffusor.hpp"
template<typename T, size_t numCh>
class Delay
{
dsp::BufferMulti<T, numCh> m_buf;
int m_delay_spec[numCh];
uint m_delaySize;
void print_delays()
{
std::cout << "delays" << std::endl;
for (int i=0; i < numCh; i++)
{
std::cout << m_delay_spec[i] << " ";
}
std::cout << std::endl;
}
public:
Delay(uint delayCapacity, int delayOffset)
: m_buf(delayCapacity)
{
setDelay(delayCapacity, delayOffset);
}
void setDelay(uint delaySize, int delayOffset)
{
float delayRagePerWindow = (float)(delaySize-delayOffset)/(float)numCh;
if (delayRagePerWindow < 0)
{
return;
}
// Delay spec
for (int i=0; i < numCh; i++)
{
float base_delay = i*delayRagePerWindow + delayOffset;
float z = (float)rand()/(float)RAND_MAX;
int delay = (int)(base_delay + z*delayRagePerWindow);
m_delay_spec[i] = -delay;
}
m_delaySize = delaySize;
print_delays();
}
uint getDelay()
{
return m_delaySize;
}
void process(T in, T out[numCh])
{
m_buf = in;
m_buf.quer(out, m_delay_spec);
++m_buf;
}
void process(T data[numCh])
{
m_buf = data;
m_buf.quer(data, m_delay_spec);
++m_buf;
}
void process(T in[numCh], T out[numCh])
{
m_buf = in;
m_buf.quer(out, m_delay_spec);
++m_buf;
}
};
template<typename T, size_t numCh>
class Diffusor
{
Delay<T, numCh> m_dly;
int m_shuffle_spec[numCh];
void print_shuffle()
{
std::cout << "shuffle" << std::endl;
for (int i=0; i < numCh; i++)
{
std::cout << m_shuffle_spec[i] << " ";
}
std::cout << std::endl;
}
void shuffle_init(double pn)
{
// Shuffle spec
for (int i=0; i < numCh; i++)
{
m_shuffle_spec[i] = i;
}
// Shuffle values
for (int i=0; i < 2*numCh; i++)
{
int i1 = rand() & (numCh-1);
int i2 = rand() & (numCh-1);
int temp = m_shuffle_spec[i1];
m_shuffle_spec[i1] = m_shuffle_spec[i2];
m_shuffle_spec[i2] = temp;
}
// Shuffle signs
for (int i=0; i < numCh; i++)
{
double z = (double)rand()/(double)RAND_MAX;
if (z < pn)
{
m_shuffle_spec[i] *= (T)-1;
}
}
print_shuffle();
}
public:
Diffusor(uint maxDelaySize, double pn=0.5)
: m_dly(maxDelaySize, 0)
{
shuffle_init(pn);
}
void setDelay(uint delay)
{
m_dly.setDelay(delay, 0);
}
uint getDelay()
{
return m_dly.getDelay();
}
inline T process(T in)
{
T temp[numCh];
m_dly.process(in, temp);
Shuffle<T, numCh>::inPlace(temp, m_shuffle_spec);
Hadamard<T, numCh>::inPlace(temp);
Householder<T, numCh>::inPlace(temp);
return temp[0];
}
// In-place
inline void process_multi(T in_out[numCh])
{
m_dly.process(in_out);
Shuffle<T, numCh>::inPlace(in_out, m_shuffle_spec);
Hadamard<T, numCh>::inPlace(in_out);
}
// Out-of-place
inline void process_multi(T in[numCh], T out[numCh])
{
m_dly.process(in, out);
Shuffle<T, numCh>::outOfPlace(in, out, m_shuffle_spec);
Hadamard<T, numCh>::inPlace(out);
}
};
template<typename T, uint numCh>
class Reverb
{
std::vector<Diffusor<T, numCh>> m_diffusors;
Delay<T, numCh> m_feedbackDly;
MultiDelay<T, numCh> m_feedbackDly;
T fb_dly_out[numCh];
T fb_gain;