aboutsummaryrefslogtreecommitdiff
path: root/cyclone/hammer/midiformat.c
diff options
context:
space:
mode:
Diffstat (limited to 'cyclone/hammer/midiformat.c')
-rw-r--r--cyclone/hammer/midiformat.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/cyclone/hammer/midiformat.c b/cyclone/hammer/midiformat.c
new file mode 100644
index 0000000..fa0612b
--- /dev/null
+++ b/cyclone/hammer/midiformat.c
@@ -0,0 +1,112 @@
+/* Copyright (c) 2002-2003 krzYszcz and others.
+ * For information on usage and redistribution, and for a DISCLAIMER OF ALL
+ * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
+
+#include "m_pd.h"
+
+typedef struct _midiformat
+{
+ t_object x_ob;
+ t_float x_channel;
+} t_midiformat;
+
+static t_class *midiformat_class;
+
+static int midiformat_channel(t_midiformat *x)
+{
+ int ch = (int)x->x_channel;
+ return (ch > 0 ? (ch - 1) & 0x0F : 0);
+}
+
+static void midiformat_note(t_midiformat *x, t_symbol *s, int ac, t_atom *av)
+{
+ if (ac >= 2 && av[0].a_type == A_FLOAT && av[1].a_type == A_FLOAT)
+ {
+ int pitch = (int)av[0].a_w.w_float; /* CHECKED: anything goes */
+ int velocity = (int)av[1].a_w.w_float;
+ outlet_float(((t_object *)x)->ob_outlet, 0x90 | midiformat_channel(x));
+ outlet_float(((t_object *)x)->ob_outlet, pitch);
+ outlet_float(((t_object *)x)->ob_outlet, velocity);
+ }
+}
+
+static void midiformat_polytouch(t_midiformat *x,
+ t_symbol *s, int ac, t_atom *av)
+{
+ if (ac >= 2 && av[0].a_type == A_FLOAT && av[1].a_type == A_FLOAT)
+ {
+ int touch = (int)av[0].a_w.w_float;
+ int key = (int)av[1].a_w.w_float;
+ outlet_float(((t_object *)x)->ob_outlet, 0xA0 | midiformat_channel(x));
+ outlet_float(((t_object *)x)->ob_outlet, key);
+ outlet_float(((t_object *)x)->ob_outlet, touch);
+ }
+}
+
+static void midiformat_controller(t_midiformat *x,
+ t_symbol *s, int ac, t_atom *av)
+{
+ if (ac >= 2 && av[0].a_type == A_FLOAT && av[1].a_type == A_FLOAT)
+ {
+ int val = (int)av[0].a_w.w_float;
+ int ctl = (int)av[1].a_w.w_float;
+ outlet_float(((t_object *)x)->ob_outlet, 0xB0 | midiformat_channel(x));
+ outlet_float(((t_object *)x)->ob_outlet, ctl);
+ outlet_float(((t_object *)x)->ob_outlet, val);
+ }
+}
+
+static void midiformat_program(t_midiformat *x, t_floatarg f)
+{
+ int pgm = (int)f;
+ outlet_float(((t_object *)x)->ob_outlet, 0xC0 | midiformat_channel(x));
+ outlet_float(((t_object *)x)->ob_outlet, pgm);
+}
+
+static void midiformat_touch(t_midiformat *x, t_floatarg f)
+{
+ int touch = (int)f;
+ outlet_float(((t_object *)x)->ob_outlet, 0xD0 | midiformat_channel(x));
+ outlet_float(((t_object *)x)->ob_outlet, touch);
+}
+
+static void midiformat_bend(t_midiformat *x, t_floatarg f)
+{
+ int val = (int)f;
+ outlet_float(((t_object *)x)->ob_outlet, 0xE0 | midiformat_channel(x));
+ outlet_float(((t_object *)x)->ob_outlet, 0);
+ outlet_float(((t_object *)x)->ob_outlet, val);
+}
+
+static void *midiformat_new(t_floatarg f)
+{
+ t_midiformat *x = (t_midiformat *)pd_new(midiformat_class);
+ x->x_channel = f;
+ inlet_new((t_object *)x, (t_pd *)x, &s_list, gensym("lst1"));
+ inlet_new((t_object *)x, (t_pd *)x, &s_list, gensym("lst2"));
+ inlet_new((t_object *)x, (t_pd *)x, &s_float, gensym("ft3"));
+ inlet_new((t_object *)x, (t_pd *)x, &s_float, gensym("ft4"));
+ inlet_new((t_object *)x, (t_pd *)x, &s_float, gensym("ft5"));
+ floatinlet_new((t_object *)x, &x->x_channel);
+ outlet_new((t_object *)x, &s_float);
+ return (x);
+}
+
+void midiformat_setup(void)
+{
+ midiformat_class = class_new(gensym("midiformat"),
+ (t_newmethod)midiformat_new, 0,
+ sizeof(t_midiformat), 0,
+ A_DEFFLOAT, 0);
+ class_addlist(midiformat_class, midiformat_note);
+ class_addmethod(midiformat_class, (t_method)midiformat_polytouch,
+ gensym("lst1"), A_GIMME, 0);
+ class_addmethod(midiformat_class, (t_method)midiformat_controller,
+ gensym("lst2"), A_GIMME, 0);
+ class_addmethod(midiformat_class, (t_method)midiformat_program,
+ gensym("ft3"), A_FLOAT, 0);
+ class_addmethod(midiformat_class, (t_method)midiformat_touch,
+ gensym("ft4"), A_FLOAT, 0);
+ class_addmethod(midiformat_class, (t_method)midiformat_bend,
+ gensym("ft5"), A_FLOAT, 0);
+}