void ft_run(LADSPA_Handle h, unsigned long sc) { LADSPA_Data *ibuff0 = FTST(h)->ports[FT_IA_INP0]; LADSPA_Data freq0 = *FTST(h)->ports[FT_IC_FREQ0]; LADSPA_Data freq1 = *FTST(h)->ports[FT_IC_FREQ1]; LADSPA_Data var0 = *FTST(h)->ports[FT_IC_VAR0]; LADSPA_Data var1 = *FTST(h)->ports[FT_IC_VAR1]; LADSPA_Data svar0 = *FTST(h)->ports[FT_IC_SVAR0]; LADSPA_Data svar1 = *FTST(h)->ports[FT_IC_SVAR1]; LADSPA_Data *obuff0 = FTST(h)->ports[FT_OA_OUT0]; LADSPA_Data a = FTST(h)->a; LADSPA_Data b = FTST(h)->b; LADSPA_Data c = FTST(h)->c; LADSPA_Data d = FTST(h)->d; LADSPA_Data r1 = FTST(h)->r1; LADSPA_Data r2 = FTST(h)->r2; LADSPA_Data r3 = FTST(h)->r3; LADSPA_Data r4 = FTST(h)->r4; LADSPA_Data r5 = FTST(h)->r5; LADSPA_Data r6 = FTST(h)->r6; LADSPA_Data r7 = FTST(h)->r7; LADSPA_Data r8 = FTST(h)->r8; LADSPA_Data p0 = FTST(h)->p0; LADSPA_Data p1 = FTST(h)->p1; double sum = FTST(h)->sum; double in; double sr = FTST(h)->sr; unsigned int i, j; a = d / (svar0 + d); for (i = 0; i < sc; i++) { in = ibuff0[i]; /* j = (unsigned int)(p0); r2 = p0 - (float)j; r1 = table[j] * (1. - r2) + table[j+1] * r2; p0 = fmod(p0 += freq0 / sr * (double)TSZ, (double)TSZ); */ r1 = table[(unsigned int)(RANDOM() * TSZ)]; /* low pass filter r1 = a * in + (1.f - a) * r1; */ obuff0[i] = r1; } FTST(h)->sum = sum; FTST(h)->a = a; FTST(h)->b = b; FTST(h)->c = c; FTST(h)->d = d; FTST(h)->r1 = r1; FTST(h)->r2 = r2; FTST(h)->r3 = r3; FTST(h)->r4 = r4; FTST(h)->r5 = r5; FTST(h)->r6 = r6; FTST(h)->r7 = r7; FTST(h)->r8 = r8; FTST(h)->p0 = p0; FTST(h)->p1 = p1; }
void ft_connect(LADSPA_Handle h, unsigned long p, LADSPA_Data *buff) { FTST(h)->ports[p] = buff; }
void ft_activate(LADSPA_Handle h) { FTST(h)->d = 1.f/44100.f; FTST(h)->r1 = 0.f; }
/* * dooper() will execute a constant operation in a node and return * the node to be the result of the operation. */ static EXPR *dooper P1 (EXPR *, ep) { EXPRTYPE type = ep->nodetype; ep->nodetype = ep->v.p[0]->nodetype; switch (ep->v.p[0]->nodetype) { #ifdef FLOAT_SUPPORT #ifndef FLOAT_BOOTSTRAP RVAL f; #endif /* FLOAT_BOOTSTRAP */ case en_fcon: #ifndef FLOAT_BOOTSTRAP FASSIGN (f, ep->v.p[0]->v.f); switch (type) { case en_uminus: FASSIGN (ep->v.f, f); FNEG (ep->v.f); break; case en_test: ep->v.i = FTST (f) ? (IVAL) 1 : (IVAL) 0; ep->nodetype = en_icon; break; case en_not: ep->v.i = FTST (f) ? (IVAL) 0 : (IVAL) 1; ep->nodetype = en_icon; break; case en_cast: if (is_real_floating_type (ep->etp)) { ep->v.f = f; } else if (is_bool (ep->etp)) { ep->v.u = (UVAL) (f ? 1 : 0); ep->nodetype = en_icon; } else { FTOL (ep->v.i, f); ep->v.i = strip_icon (ep->v.i, ep->etp); ep->nodetype = en_icon; } break; case en_add: FADD3 (ep->v.f, f, ep->v.p[1]->v.f); break; case en_sub: FSUB3 (ep->v.f, f, ep->v.p[1]->v.f); break; case en_mul: FMUL3 (ep->v.f, f, ep->v.p[1]->v.f); break; case en_div: if (FTST (ep->v.p[1]->v.f)) { FDIV3 (ep->v.f, f, ep->v.p[1]->v.f); } else { ep->nodetype = en_div; } break; case en_eq: ep->v.i = (IVAL) FEQ (f, ep->v.p[1]->v.f); ep->nodetype = en_icon; break; case en_ne: ep->v.i = (IVAL) FNE (f, ep->v.p[1]->v.f); ep->nodetype = en_icon; break; case en_land: ep->v.i = (IVAL) (FTST (f) && FTST (ep->v.p[1]->v.f)); ep->nodetype = en_icon; break; case en_lor: ep->v.i = (IVAL) (FTST (f) || FTST (ep->v.p[1]->v.f)); ep->nodetype = en_icon; break; case en_lt: ep->v.i = (IVAL) FLT (f, ep->v.p[1]->v.f); ep->nodetype = en_icon; break; case en_le: ep->v.i = (IVAL) FLE (f, ep->v.p[1]->v.f); ep->nodetype = en_icon; break; case en_gt: ep->v.i = (IVAL) FGT (f, ep->v.p[1]->v.f); ep->nodetype = en_icon; break; case en_ge: ep->v.i = (IVAL) FGE (f, ep->v.p[1]->v.f); ep->nodetype = en_icon; break; default: CANNOT_REACH_HERE (); break; } break; #endif /* FLOAT_BOOTSTRAP */ #endif /* FLOAT_SUPPORT */ case en_icon: if (is_unsigned_type (ep->v.p[0]->etp)) { UVAL u = ep->v.p[0]->v.u; switch (type) { case en_uminus: /* * unary minus on an unsigned is normally a mistake so we must * fool the compiler into not giving a warning. */ ep->v.u = (UVAL) (-(IVAL) u); break; case en_test: ep->v.u = (u ? (UVAL) 1 : (UVAL) 0); break; case en_not: ep->v.u = (u ? (UVAL) 0 : (UVAL) 1); break; case en_compl: ep->v.u = (UVAL) strip_icon ((IVAL) ~u, ep->etp); break; case en_cast: if (is_bool (ep->etp)) { ep->v.u = (UVAL) (u ? 1 : 0); #ifdef FLOAT_SUPPORT } else if (is_real_floating_type (ep->etp)) { ep->nodetype = en_fcon; UTOF (ep->v.f, u); break; #endif /* FLOAT_SUPPORT */ } else { ep->v.u = (UVAL) strip_icon ((IVAL) u, ep->etp); } break; case en_add: ep->v.u = u + ep->v.p[1]->v.u; break; case en_sub: ep->v.u = u - ep->v.p[1]->v.u; break; case en_mul: ep->v.u = u * ep->v.p[1]->v.u; break; case en_div: if (ep->v.p[1]->v.u == (UVAL) 0) { ep->nodetype = en_div; } else { ep->v.u = u / ep->v.p[1]->v.u; } break; case en_mod: if (ep->v.p[1]->v.u == (UVAL) 0) { ep->nodetype = en_mod; } else { ep->v.u = u % ep->v.p[1]->v.u; } break; case en_and: ep->v.u = u & ep->v.p[1]->v.u; break; case en_or: ep->v.u = u | ep->v.p[1]->v.u; break; case en_xor: ep->v.u = u ^ ep->v.p[1]->v.u; break; case en_eq: ep->v.u = (UVAL) (u == ep->v.p[1]->v.u); break; case en_ne: ep->v.u = (UVAL) (u != ep->v.p[1]->v.u); break; case en_land: ep->v.u = (UVAL) (u && ep->v.p[1]->v.u); break; case en_lor: ep->v.u = (UVAL) (u || ep->v.p[1]->v.u); break; case en_lt: ep->v.u = (UVAL) (u < ep->v.p[1]->v.u); break; case en_le: ep->v.u = (UVAL) (u <= ep->v.p[1]->v.u); break; case en_gt: ep->v.u = (UVAL) (u > ep->v.p[1]->v.u); break; case en_ge: ep->v.u = (UVAL) (u >= ep->v.p[1]->v.u); break; case en_lsh: ep->v.u = u << ep->v.p[1]->v.u; break; case en_rsh: ep->v.u = u >> ep->v.p[1]->v.u; break; default: CANNOT_REACH_HERE (); break; } } else {