diff --git a/reverb/reverb.hpp b/reverb/reverb.hpp index e302a32..9895c60 100644 --- a/reverb/reverb.hpp +++ b/reverb/reverb.hpp @@ -2,183 +2,18 @@ #define REVERB_H #include -#include #include #include #include -#include +#include "diffusor.hpp" -template -class Delay -{ - dsp::BufferMulti 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 -class Diffusor -{ - Delay 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::inPlace(temp, m_shuffle_spec); - Hadamard::inPlace(temp); - Householder::inPlace(temp); - - return temp[0]; - } - - // In-place - inline void process_multi(T in_out[numCh]) - { - m_dly.process(in_out); - - Shuffle::inPlace(in_out, m_shuffle_spec); - Hadamard::inPlace(in_out); - } - - // Out-of-place - inline void process_multi(T in[numCh], T out[numCh]) - { - m_dly.process(in, out); - - Shuffle::outOfPlace(in, out, m_shuffle_spec); - Hadamard::inPlace(out); - } -}; template class Reverb { std::vector> m_diffusors; - Delay m_feedbackDly; + MultiDelay m_feedbackDly; + T fb_dly_out[numCh]; T fb_gain;