-
Notifications
You must be signed in to change notification settings - Fork 6
/
interpolatingBuffer.cpp
118 lines (104 loc) · 2.3 KB
/
interpolatingBuffer.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
/*
* interpolatingBuffer.cpp
*
* Created on: Jan 28, 2015
* Author: dasvaclav
*/
#include "interpolatingBuffer.h"
#include <Arduino.h>
//#include <random.h>
#include <Line.h>
//#include "mapping.h"
Line <float> linear[6];
/*
interpolatingBuffer::interpolatingBuffer(){
}
*/
void interpolatingBuffer::init(uint8_t channel){
intCh=channel;
}
void interpolatingBuffer::sync(){
}
uint8_t interpolatingBuffer::getCurrentValue(){
if(interpolate){
if(interpolatedSteps<interpolateInSteps){
interpolatedSteps++;
return linear[intCh].next();
}
else{
if(interpolateStep==31) return buffer[0];
else return buffer[interpolateStep+1];
}
}
else if(smoothingAmount==0) return buffer[0];
else return calculateSmoothAverage();
}
void interpolatingBuffer::update(){
//linear.update();
smallSteps++;
if(smallSteps>=periodInSteps){
smallSteps=0;
if(step<31){
step++;
}
else{
step=0;
}
if(!interpolate){
if(!loopState) addRandomStep(); //?
else rotateBuffer();
}
}
smoothSteps++;
//if(smoothingAmount>127){
uint16_t smoothingSkip=map(smoothingAmount,0,2047,0,periodInSteps);
if(smoothSteps>=smoothingSkip){
smoothSteps=0;
addSmoothStep(buffer[0]);
}
}
void interpolatingBuffer::setStep(uint8_t _step){
interpolateStep=_step;
interpolateInSteps=map(interpolateAmount,0,255,1,periodInSteps);
if(interpolate){
if(_step<31){
linear[intCh].set(buffer[_step],buffer[_step+1],interpolateInSteps);
}
else{
linear[intCh].set(buffer[_step],buffer[0],interpolateInSteps);
}
}
interpolatedSteps=0;
}
void interpolatingBuffer::addRandomStep(){
rotateBuffer();
int16_t randomNumber=random(0,64)-31+buffer[1];
if(randomNumber>255) randomNumber=255;
if(randomNumber<0) randomNumber=0;
buffer[0]=randomNumber;
}
void interpolatingBuffer::addSmoothStep(uint8_t _value){
rotateSmoothBuffer();
smoothBuffer[0]=_value;
}
void interpolatingBuffer::rotateBuffer(){
uint8_t temp=buffer[31];
for(uint8_t i=31;i>0;i--){
buffer[i]=buffer[i-1];
}
buffer[0]=temp;
}
void interpolatingBuffer::rotateSmoothBuffer(){
uint8_t temp=smoothBuffer[31];
for(uint8_t i=31;i>0;i--){
smoothBuffer[i]=smoothBuffer[i-1];
}
smoothBuffer[0]=temp;
}
uint8_t interpolatingBuffer::calculateSmoothAverage(){
uint16_t sum=0;
for(int i=0;i<32;i++){
sum+=smoothBuffer[i];
}
return sum/32;
}