-
Notifications
You must be signed in to change notification settings - Fork 0
/
BlockComb.cpp
53 lines (48 loc) · 1.46 KB
/
BlockComb.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include "BlockComb.h"
#include <math.h>
using namespace daisysp;
static float log001 = -6.9078f; // log .001
void BlockComb::Init(float sample_rate, float* buff, size_t size)
{
sample_rate_ = sample_rate;
rev_time_ = 3.5;
max_size_ = size;
max_loop_time_ = ((float)size / sample_rate_) - .01;
loop_time_ = max_loop_time_;
mod_ = sample_rate_ * loop_time_;
buf_ = buff;
prvt_ = 0.0f;
coef_ = 0.0f;
buf_pos_ = 0;
}
void BlockComb::Process( float *buf, size_t bufferSize ){
for( size_t i = 0; i < bufferSize; i++ ){
float tmp = 0;
float coef = coef_;
float outsamp = 0;
if( prvt_ != rev_time_ ){
prvt_ = rev_time_;
float exp_arg = ( float )( log001 * loop_time_ / prvt_ );
if( exp_arg < -36.8413615 ) coef = coef_ = 0;
else coef = coef_ = expf( exp_arg );
}
// internal delay line
outsamp = buf_[ ( buf_pos_ + mod_ ) % max_size_ ];
tmp = ( outsamp * coef ) + buf[ i ];
buf_[ (size_t) buf_pos_ ] = tmp;
buf_pos_ = ( buf_pos_ - 1 + max_size_ ) % max_size_;
buf[ i ] = outsamp;
}
}
void BlockComb::SetPeriod(float looptime)
{
if(looptime > 0)
{
loop_time_ = fminf(looptime, max_loop_time_);
mod_ = loop_time_ * sample_rate_;
if(mod_ > max_size_)
{
mod_ = max_size_ - 1;
}
}
}