-
Notifications
You must be signed in to change notification settings - Fork 0
/
pitchLP.cpp
146 lines (125 loc) · 3.62 KB
/
pitchLP.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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <cmath>
#include "daisysp.h"
#include "pitchLP.h"
using namespace daisysp;
void PitchLP::Init(float* buffer_)
{
buffer = buffer_;
buf_size = 48000;
for (int i = 0; i < size; i++)
{
buffer[i] = 0;
buffer[i + buf_size] = 0;
buffer[i + buf_size * 2] = 0;
buffer[i + buf_size * 3] = 0;
}
index_write = 0;
buffer_select = true;
sample_raw_prev = 0;
amount = 1;
filt1.Init(48000);
filt1.SetRes(0.1f);
filt1.SetDrive(0.1f);
filt1.SetFreq(100.0f);
}
void PitchLP::setAmount(float amount_)
{
amount = amount_;
}
float PitchLP::tanhWindower(int index)
{
float index_norm = float(index) / float(size);
if (amount < 1.0)
{
index_norm = index_norm / amount;
}
if (index_norm < 0.5)
{
index_norm = (index_norm * 18.0) - 2.0;
}
else
{
index_norm = ((1.0 - index_norm) * 18.0) - 2.0;
}
float temp = 0;
if (index_norm < -3.f)
{
temp = -1.f;
}
else if (index_norm > 3.f)
{
temp = 1.f;
}
else
{
float in2 = index_norm*index_norm;
temp = index_norm * (27.f + in2) / (27.f + in2 * 9.f);
}
return (temp + 1.0) / 2.0;
}
float PitchLP::windower(int index)
{
float index_norm = float(index) / float(size);
if (amount < 1.0)
{
index_norm = index_norm / amount;
}
if (index_norm < 0.5)
{
return index_norm * 2.0;
}
else if (index_norm > 0.5)
{
return (1.0 - index_norm) * 2.0;
}
else
{
return 1.0;
}
}
float PitchLP::process(float sample_raw)
{
filt1.Process(sample_raw);
float sample = filt1.High();
float output = 0;
index_write++;
if (index_write >= size)
{
buffer_select = !buffer_select;
index_write = 0;
}
int index_write1 = index_write;
int index_write2 = (index_write + (size / 4)) % size;
int index_write3 = (index_write + (size / 2)) % size;
int index_write4 = (index_write + ((3 * size) / 4)) % size;
buffer[index_write1] = sample;
buffer[index_write2 + buf_size] = sample;
buffer[index_write3 + buf_size * 2] = sample;
buffer[index_write4 + buf_size * 3] = sample;
float kerroin = amount;
int size_kerroin = int(float(size) / kerroin);
float kerroin_minus_one = kerroin - 1.0;
float ker_min1_pos = kerroin_minus_one < 0 ? 0 : kerroin_minus_one;
int size_min_size_ker_pos = size - size_kerroin < 0 ? 0 : size - size_kerroin;
if (index_write1 > size_min_size_ker_pos)
{
int temp1 = int(float(index_write1 - size_min_size_ker_pos) * kerroin);
output += buffer[temp1] * tanhWindower(temp1) * (ker_min1_pos + 0.2 + (windower(temp1) * 0.8 * (1.0 - ker_min1_pos)));
}
if (index_write2 > size_min_size_ker_pos)
{
int temp2 = int(float(index_write2 - size_min_size_ker_pos) * kerroin);
output += buffer[temp2 + buf_size] * tanhWindower(temp2) * (ker_min1_pos + (windower(temp2) * (1.0 - ker_min1_pos))) * (ker_min1_pos * 0.75 + 0.25);
}
if (index_write3 > size_min_size_ker_pos)
{
int temp3 = int(float(index_write3 - size_min_size_ker_pos) * kerroin);
output += buffer[temp3 + buf_size * 2] * tanhWindower(temp3) * (ker_min1_pos + 0.2 + (windower(temp3) * 0.8 * (1.0 - ker_min1_pos)));
}
if (index_write4 > size_min_size_ker_pos)
{
int temp4 = int(float(index_write4 - size_min_size_ker_pos) * kerroin);
output += buffer[temp4 + buf_size * 3] * tanhWindower(temp4) * (ker_min1_pos + (windower(temp4) * (1.0 - ker_min1_pos))) * (ker_min1_pos * 0.75 + 0.25);
}
return output;
}