aboutsummaryrefslogtreecommitdiff
path: root/pansig~.c
diff options
context:
space:
mode:
Diffstat (limited to 'pansig~.c')
-rw-r--r--pansig~.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/pansig~.c b/pansig~.c
new file mode 100644
index 0000000..346e94b
--- /dev/null
+++ b/pansig~.c
@@ -0,0 +1,136 @@
+#include "m_pd.h"
+#include <math.h>
+
+static t_class *pansig_class;
+
+/* #define RADCONST 0.017453293 */
+#define RADCONST 0.785398163
+#define ROOT2DIV2 0.707106781
+
+typedef struct _pansig
+{
+ t_object x_obj;
+ float x_f;
+ float pan;
+ float left;
+ float right;
+} t_pansig;
+
+static void *pansig_new(t_symbol *s, int argc, t_atom *argv)
+{
+ t_pansig *x = (t_pansig *)pd_new(pansig_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"));
+ // inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("pansigf"));
+
+ x->x_f = 0;
+ return (x);
+}
+
+static void pansig_getpan(t_floatarg signal, t_floatarg *left, t_floatarg *right)
+{
+ double tmp, result;
+ double angle;
+ signal = signal < -1 ? -1 : signal;
+ signal = signal > 1 ? 1 : signal;
+ angle = signal * RADCONST;
+ *right = ROOT2DIV2 * (cos(angle) + sin(angle));
+ *left = ROOT2DIV2 * (cos(angle) - sin(angle));
+
+/* if(signal < 0) */
+/* signal = 0; */
+/* if(signal > 0.999) */
+/* signal = 0.999; */
+/* tmp = (tan(1.5866 * signal - 0.785398) + 1) / 2; */
+/* result = sqrt(tmp); */
+/* if (result < 0) */
+/* *right = 0; */
+/* else if (result > 1) */
+/* *right = 1; */
+/* else */
+/* *right = result; */
+/* tmp = tmp * -1 + 1; */
+/* if(tmp < 0) */
+/* tmp = 0; */
+/* result = sqrt(tmp); */
+/* if (result < 0) */
+/* *left = 0; */
+/* else if (result > 1) */
+/* *left = 1; */
+/* else */
+/* *left = result; */
+}
+
+static t_int *pansig_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]);
+ t_pansig *x = (t_pansig *)(w[6]);
+ float value, value2, left, right;
+ while (n--)
+ {
+ value = *in1++;
+ value2 = *in2++;
+ pansig_getpan(value2, &left, &right);
+/* *out1++ = value * x->left; */
+/* *out2++ = value * x->right; */
+ *out1++ = value * left;
+ *out2++ = value * right;
+/* *out1++ = value; */
+/* *out2++ = value; */
+ }
+ return (w+7);
+}
+
+static void pansig_dsp(t_pansig *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;
+
+ dsp_add(pansig_perform, 6,
+ in1, in2, out1, out2, n, x);
+}
+
+void pansig_f(t_pansig *x, t_floatarg f)
+{
+ double tmp, result;
+ if(f < 0)
+ f = 0;
+ if(f > 0.999)
+ f = 0.999;
+ tmp = (tan(1.5866 * f - 0.785398) + 1) / 2;
+ result = sqrt(tmp);
+ if (result < 0)
+ x->right = 0;
+ else if (result > 1)
+ x->right = 1;
+ else
+ x->right = result;
+ tmp = tmp * -1 + 1;
+ if(tmp < 0)
+ tmp = 0;
+ result = sqrt(tmp);
+ if (result < 0)
+ x->left = 0;
+ else if (result > 1)
+ x->left = 1;
+ else
+ x->left = result;
+}
+
+void pansig_tilde_setup(void)
+{
+ pansig_class = class_new(gensym("pansig~"), (t_newmethod)pansig_new, 0,
+ sizeof(t_pansig), 0, A_GIMME, 0);
+ class_addmethod(pansig_class, nullfn, gensym("signal"), 0);
+
+ class_addmethod(pansig_class, (t_method)pansig_dsp, gensym("dsp"), 0);
+ // class_addmethod(pansig_class, (t_method)pansig_f, gensym("pansigf"), A_FLOAT, 0);
+}