-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcomb.c
71 lines (63 loc) · 1.5 KB
/
comb.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
/*
* comb
*
* This code has been extracted from the Csound opcode "comb".
* It has been modified to work as a Soundpipe module.
*
* Original Author(s): Barry Vercoe, John ffitch
* Year: 1991
* Location: OOps/ugens6.c
*
*/
#include <math.h>
#include <stdlib.h>
#include "soundpipe.h"
#define log001 (-(SPFLOAT)6.9078) /* log(.001) */
int sp_comb_create(sp_comb **p)
{
*p = malloc(sizeof(sp_comb));
return SP_OK;
}
int sp_comb_destroy(sp_comb **p)
{
sp_comb *pp = *p;
sp_auxdata_free(&pp->aux);
free(*p);
return SP_OK;
}
int sp_comb_init(sp_data *sp, sp_comb *p, SPFLOAT looptime)
{
p->revtime = 3.5;
p->looptime = looptime;
p->bufsize = (uint32_t) (0.5 + looptime * sp->sr);
sp_auxdata_alloc(&p->aux, p->bufsize * sizeof(SPFLOAT));
p->prvt = 0.0;
p->coef = 0.0;
p->bufpos = 0;
return SP_OK;
}
int sp_comb_compute(sp_data *sp, sp_comb *p, SPFLOAT *in, SPFLOAT *out)
{
SPFLOAT tmp = 0;
SPFLOAT coef = p->coef;
SPFLOAT outsamp = 0;
SPFLOAT *buf = (SPFLOAT *)p->aux.ptr;
if(p->prvt != p->revtime) {
p->prvt = p->revtime;
SPFLOAT exp_arg = (SPFLOAT) (log001 * p->looptime / p->prvt);
if(exp_arg < -36.8413615) {
coef = p->coef = 0;
} else {
coef = p->coef = exp(exp_arg);
}
}
outsamp = buf[p->bufpos];
tmp = outsamp;
tmp *= coef;
tmp += *in;
buf[p->bufpos] = tmp;
*out = outsamp;
p->bufpos++;
p->bufpos %= p->bufsize;
return SP_OK;
}