[Reverb]
- no channel sum for last diffusion step - elimnated latency due to feedback delay - added print for channel shuffle and delay values
This commit is contained in:
+39
-8
@@ -6,6 +6,7 @@
|
|||||||
#include <common/mix.hpp>
|
#include <common/mix.hpp>
|
||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
template<typename T, size_t numCh>
|
template<typename T, size_t numCh>
|
||||||
class Delay
|
class Delay
|
||||||
@@ -14,6 +15,15 @@ class Delay
|
|||||||
int m_delay_spec[numCh];
|
int m_delay_spec[numCh];
|
||||||
uint m_delaySize;
|
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:
|
public:
|
||||||
Delay(uint delayCapacity, int delayOffset)
|
Delay(uint delayCapacity, int delayOffset)
|
||||||
: m_buf(delayCapacity)
|
: m_buf(delayCapacity)
|
||||||
@@ -40,6 +50,7 @@ class Delay
|
|||||||
m_delay_spec[i] = -delay;
|
m_delay_spec[i] = -delay;
|
||||||
}
|
}
|
||||||
m_delaySize = delaySize;
|
m_delaySize = delaySize;
|
||||||
|
print_delays();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint getDelay()
|
uint getDelay()
|
||||||
@@ -75,9 +86,17 @@ class Diffusor
|
|||||||
Delay<T, numCh> m_dly;
|
Delay<T, numCh> m_dly;
|
||||||
int m_shuffle_spec[numCh];
|
int m_shuffle_spec[numCh];
|
||||||
|
|
||||||
public:
|
void print_shuffle()
|
||||||
Diffusor(uint maxDelaySize)
|
{
|
||||||
: m_dly(maxDelaySize, 0)
|
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
|
// Shuffle spec
|
||||||
for (int i=0; i < numCh; i++)
|
for (int i=0; i < numCh; i++)
|
||||||
@@ -96,15 +115,22 @@ class Diffusor
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Shuffle signs
|
// Shuffle signs
|
||||||
float p = 0.3;
|
|
||||||
for (int i=0; i < numCh; i++)
|
for (int i=0; i < numCh; i++)
|
||||||
{
|
{
|
||||||
float z = (float)rand()/(float)RAND_MAX;
|
double z = (double)rand()/(double)RAND_MAX;
|
||||||
if (z <= p)
|
if (z < pn)
|
||||||
{
|
{
|
||||||
m_shuffle_spec[i] *= (T)-1;
|
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)
|
void setDelay(uint delay)
|
||||||
@@ -141,7 +167,7 @@ class Diffusor
|
|||||||
// Out-of-place
|
// Out-of-place
|
||||||
inline void process_multi(T in[numCh], T out[numCh])
|
inline void process_multi(T in[numCh], T out[numCh])
|
||||||
{
|
{
|
||||||
m_dly.process(in);
|
m_dly.process(in, out);
|
||||||
|
|
||||||
Shuffle<T, numCh>::outOfPlace(in, out, m_shuffle_spec);
|
Shuffle<T, numCh>::outOfPlace(in, out, m_shuffle_spec);
|
||||||
Hadamard<T, numCh>::inPlace(out);
|
Hadamard<T, numCh>::inPlace(out);
|
||||||
@@ -168,6 +194,11 @@ class Reverb
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint getNumDiffusionSteps()
|
||||||
|
{
|
||||||
|
return m_diffusors.size();
|
||||||
|
}
|
||||||
|
|
||||||
void setDelay(uint delay, uint index)
|
void setDelay(uint delay, uint index)
|
||||||
{
|
{
|
||||||
m_diffusors[index].setDelay(delay);
|
m_diffusors[index].setDelay(delay);
|
||||||
@@ -215,7 +246,7 @@ class Reverb
|
|||||||
// Mix
|
// Mix
|
||||||
for (int c=0; c < numCh; c++)
|
for (int c=0; c < numCh; c++)
|
||||||
{
|
{
|
||||||
out[i] += fb_dly_out[c];
|
out[i] = temp[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user