-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpshift.c
153 lines (125 loc) · 3.92 KB
/
pshift.c
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
147
148
149
150
151
152
153
#include <stdlib.h>
#include <math.h>
#include "soundpipe.h"
#include "CUI.h"
#define max(a,b) ((a < b) ? b : a)
#define min(a,b) ((a < b) ? a : b)
#ifndef FAUSTFLOAT
#define FAUSTFLOAT SPFLOAT
#endif
float powf(float dummy0, float dummy1);
float fmodf(float dummy0, float dummy1);
typedef struct {
float fVec0[65536];
float fRec0[2];
int IOTA;
FAUSTFLOAT fHslider0;
FAUSTFLOAT fHslider1;
FAUSTFLOAT fHslider2;
int fSamplingFreq;
} pshift;
static pshift* newpshift() {
pshift* dsp = (pshift*)malloc(sizeof(pshift));
return dsp;
}
static void deletepshift(pshift* dsp) {
free(dsp);
}
static void instanceInitpshift(pshift* dsp, int samplingFreq) {
dsp->fSamplingFreq = samplingFreq;
dsp->IOTA = 0;
/* C99 loop */
{
int i0;
for (i0 = 0; (i0 < 65536); i0 = (i0 + 1)) {
dsp->fVec0[i0] = 0.f;
}
}
dsp->fHslider0 = (FAUSTFLOAT)1000.;
dsp->fHslider1 = (FAUSTFLOAT)0.;
/* C99 loop */
{
int i1;
for (i1 = 0; (i1 < 2); i1 = (i1 + 1)) {
dsp->fRec0[i1] = 0.f;
}
}
dsp->fHslider2 = (FAUSTFLOAT)10.;
}
static void initpshift(pshift* dsp, int samplingFreq) {
instanceInitpshift(dsp, samplingFreq);
}
static void buildUserInterfacepshift(pshift* dsp, UIGlue* interface) {
interface->addHorizontalSlider(interface->uiInterface, "shift", &dsp->fHslider1, 0.f, -24.f, 24.f, 0.1f);
interface->addHorizontalSlider(interface->uiInterface, "window", &dsp->fHslider0, 1000.f, 50.f, 10000.f, 1.f);
interface->addHorizontalSlider(interface->uiInterface, "xfade", &dsp->fHslider2, 10.f, 1.f, 10000.f, 1.f);
}
static void computepshift(pshift* dsp, int count, FAUSTFLOAT** inputs, FAUSTFLOAT** outputs) {
FAUSTFLOAT* input0 = inputs[0];
FAUSTFLOAT* output0 = outputs[0];
float fSlow0 = (float)dsp->fHslider0;
float fSlow1 = ((1.f + fSlow0) - powf(2.f, (0.0833333f * (float)dsp->fHslider1)));
float fSlow2 = (1.f / (float)dsp->fHslider2);
float fSlow3 = (fSlow0 - 1.f);
/* C99 loop */
{
int i;
for (i = 0; (i < count); i = (i + 1)) {
float fTemp0 = (float)input0[i];
dsp->fVec0[(dsp->IOTA & 65535)] = fTemp0;
dsp->fRec0[0] = fmodf((dsp->fRec0[1] + fSlow1), fSlow0);
int iTemp1 = (int)dsp->fRec0[0];
int iTemp2 = (1 + iTemp1);
float fTemp3 = min((fSlow2 * dsp->fRec0[0]), 1.f);
float fTemp4 = (dsp->fRec0[0] + fSlow0);
int iTemp5 = (int)fTemp4;
output0[i] = (FAUSTFLOAT)((((dsp->fVec0[((dsp->IOTA - (iTemp1 & 65535)) & 65535)] * ((float)iTemp2 - dsp->fRec0[0])) + ((dsp->fRec0[0] - (float)iTemp1) * dsp->fVec0[((dsp->IOTA - (iTemp2 & 65535)) & 65535)])) * fTemp3) + (((dsp->fVec0[((dsp->IOTA - (iTemp5 & 65535)) & 65535)] * (0.f - ((dsp->fRec0[0] + fSlow3) - (float)iTemp5))) + ((fTemp4 - (float)iTemp5) * dsp->fVec0[((dsp->IOTA - ((1 + iTemp5) & 65535)) & 65535)])) * (1.f - fTemp3)));
dsp->IOTA = (dsp->IOTA + 1);
dsp->fRec0[1] = dsp->fRec0[0];
}
}
}
static void addHorizontalSlider(void* ui_interface, const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step)
{
sp_pshift *p = ui_interface;
p->args[p->argpos] = zone;
p->argpos++;
}
int sp_pshift_create(sp_pshift **p)
{
*p = malloc(sizeof(sp_pshift));
return SP_OK;
}
int sp_pshift_destroy(sp_pshift **p)
{
sp_pshift *pp = *p;
pshift *dsp = pp->faust;
deletepshift (dsp);
free(*p);
return SP_OK;
}
int sp_pshift_init(sp_data *sp, sp_pshift *p)
{
pshift *dsp = newpshift();
UIGlue UI;
p->argpos = 0;
UI.addHorizontalSlider= addHorizontalSlider;
UI.uiInterface = p;
buildUserInterfacepshift(dsp, &UI);
initpshift(dsp, sp->sr);
p->shift = p->args[0];
p->window = p->args[1];
p->xfade = p->args[2];
p->faust = dsp;
return SP_OK;
}
int sp_pshift_compute(sp_data *sp, sp_pshift *p, SPFLOAT *in, SPFLOAT *out)
{
pshift *dsp = p->faust;
SPFLOAT out1 = 0;
SPFLOAT *faust_out[] = {&out1};
SPFLOAT *faust_in[] = {in};
computepshift(dsp, 1, faust_in, faust_out);
*out = out1;
return SP_OK;
}