From f40d8c3d61e9ac6a7a4e06f6bfc7a2567c38bb33 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 29 Apr 2003 16:52:44 +0000 Subject: sources from motex_1_1_3.tar.gz svn path=/trunk/externals/motex/; revision=603 --- pol2rec~.c | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 pol2rec~.c (limited to 'pol2rec~.c') diff --git a/pol2rec~.c b/pol2rec~.c new file mode 100644 index 0000000..ff7f6de --- /dev/null +++ b/pol2rec~.c @@ -0,0 +1,137 @@ +/*************************************************************************** + * File: pol2rec~.c + * Auth: Iain Mott [iain.mott@bigpond.com] + * Maintainer: Iain Mott [iain.mott@bigpond.com] + * Version: Part of motex_1.1.2 + * Date: January 2001 + * + * Description: Pd signal external. Converts polar coordinates into rectangular coordinates. + * Used in conjuction with rec2pol~ (also in motex) and rfft~ + * + * Copyright (C) 2001 by Iain Mott [iain.mott@bigpond.com] + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License, which should be included with this + * program, for more details. + * + ****************************************************************************/ + +#include "m_pd.h" +#include + +static t_class *pol2rec_class; + +#define HALFPI 1.570796327 +#define PI 3.141592654 +#define PIHALF 4.71238898 +typedef struct _pol2rec +{ + t_object x_obj; + float x_f; + float pol2rec; + float left; + float right; +} t_pol2rec; + +static void *pol2rec_new(t_symbol *s, int argc, t_atom *argv) +{ + t_pol2rec *x = (t_pol2rec *)pd_new(pol2rec_class); + inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); + outlet_new(&x->x_obj, gensym("signal")); + outlet_new(&x->x_obj, gensym("signal")); + x->x_f = 0; + return (x); +} + +/* static void pol2rec_doit(t_float phase, t_float mag, double *x, double *y) */ +/* { */ +/* *x = mag*cos(phase); */ +/* *y = mag*sin(phase); */ +/* } */ + +static t_int *pol2rec_perform8(t_int *w) +{ + t_float *in1 = (t_float *)(w[1]); + t_float *in2 = (t_float *)(w[2]); + t_float *out1 = (t_float *)(w[3]); + t_float *out2 = (t_float *)(w[4]); + int n = (int)(w[5]); + for (; n; n -= 8, in1 += 8, out1 += 8, in2 += 8, out2 += 8) + { + t_float p0 = in1[0], p1 = in1[1], p2 = in1[2], p3 = in1[3]; + t_float p4 = in1[4], p5 = in1[5], p6 = in1[6], p7 = in1[7]; + t_float m0 = in2[0], m1 = in2[1], m2 = in2[2], m3 = in2[3]; + t_float m4 = in2[4], m5 = in2[5], m6 = in2[6], m7 = in2[7]; + out1[0] = m0*cos(p0); + out1[1] = m1*cos(p1); + out1[2] = m2*cos(p2); + out1[3] = m3*cos(p3); + out1[4] = m4*cos(p4); + out1[5] = m5*cos(p5); + out1[6] = m6*cos(p6); + out1[7] = m7*cos(p7); + out2[0] = m0*sin(p0); + out2[1] = m1*sin(p1); + out2[2] = m2*sin(p2); + out2[3] = m3*sin(p3); + out2[4] = m4*sin(p4); + out2[5] = m5*sin(p5); + out2[6] = m6*sin(p6); + out2[7] = m7*sin(p7); + } + return (w+6); +} + +static t_int *pol2rec_perform(t_int *w) +{ + float *in1 = (t_float *)(w[1]); + float *in2 = (t_float *)(w[2]); + float *out1 = (t_float *)(w[3]); + float *out2 = (t_float *)(w[4]); + int n = (int)(w[5]); + double phase, mag, x, y; + while (n--) + { + phase = *in1++; mag = *in2++; + *out1++ = mag*cos(phase); + *out2++ = mag*sin(phase);; + } + return (w+6); +} + +static void pol2rec_dsp(t_pol2rec *x, t_signal **sp) +{ + int n = sp[0]->s_n; + float *in1 = sp[0]->s_vec; + float *in2 = sp[1]->s_vec; + float *out1 = sp[2]->s_vec; + float *out2 = sp[3]->s_vec; + + if (n&7) + { + dsp_add(pol2rec_perform, 5, in1, in2, out1, out2, n); + post("it's a seven"); + } + else + dsp_add(pol2rec_perform8, 5, in1, in2, out1, out2, n); +} + + + +void pol2rec_tilde_setup(void) +{ + pol2rec_class = class_new(gensym("pol2rec~"), (t_newmethod)pol2rec_new, 0, + sizeof(t_pol2rec), 0, A_GIMME, 0); + class_addmethod(pol2rec_class, nullfn, gensym("signal"), 0); + + class_addmethod(pol2rec_class, (t_method)pol2rec_dsp, gensym("dsp"), 0); + CLASS_MAINSIGNALIN(pol2rec_class, t_pol2rec, x_f); + +} -- cgit v1.2.1