1 /*
2  * Metro
3  *
sp_maygate_create(sp_maygate ** p)4  * This code has been extracted from the Csound opcode "metro".
5  * It has been modified to work as a Soundpipe module.
6  *
7  * Original Author(s): Gabriel Maldonado
8  * Year: 2000
9  * Location: Opcodes/metro.c
10  *
11  */
12 
13 #include <stdlib.h>
14 #include "soundpipe.h"
15 
16 int sp_metro_create(sp_metro **p)
17 {
18     *p = malloc(sizeof(sp_metro));
19     return SP_OK;
20 }
21 
22 int sp_metro_destroy(sp_metro **p)
23 {
sp_maygate_compute(sp_data * sp,sp_maygate * p,SPFLOAT * in,SPFLOAT * out)24     free(*p);
25     return SP_OK;
26 }
27 
28 int sp_metro_init(sp_data *sp, sp_metro *p)
29 {
30     p->iphs = 0;
31     p->freq= 2.0;
32     SPFLOAT phs = p->iphs;
33     int32_t  longphs = phs;
34     if (phs >= 0.0){
35       p->curphs = (SPFLOAT)phs - (SPFLOAT)longphs;
36     }
37     p->flag=1;
38     p->onedsr = 1.0 / sp->sr;
39     return SP_OK;
40 }
41 
42 int sp_metro_compute(sp_data *sp, sp_metro *p, SPFLOAT *in, SPFLOAT *out)
43 {
44     SPFLOAT phs= p->curphs;
45     if (phs == 0.0 && p->flag){
46         *out = 1.0;
47         p->flag = 0;
48     }else if ((phs += p->freq * p->onedsr) >= 1.0){
49         *out = 1.0;
50         phs -= 1.0;
51         p->flag = 0;
52     }else{
53         *out = 0.0;
54     }
55     p->curphs = phs;
56     return SP_OK;
57 }
58