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