/* Copyright (c) 1997-2001 Miller Puckette and others. * For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ /* MIDI. */ #include "m_pd.h" extern t_symbol *ctlin_sym; static t_class *ctlin_class; typedef struct _ctlin { t_object x_obj; t_float x_channel; t_float x_ctlno; t_outlet *x_outlet1; t_outlet *x_outlet2; t_outlet *x_outlet3; } t_ctlin; static void *ctlin_new(t_symbol *s, int argc, t_atom *argv) { int ctlno, channel; t_ctlin *x = (t_ctlin *)pd_new(ctlin_class); if (!argc) ctlno = -1; else ctlno = atom_getfloatarg(0, argc, argv); channel = atom_getfloatarg(1, argc, argv); x->x_channel = channel; x->x_ctlno = ctlno; x->x_outlet1 = outlet_new(&x->x_obj, &s_float); if (!channel) { if (x->x_ctlno < 0) x->x_outlet2 = outlet_new(&x->x_obj, &s_float); x->x_outlet3 = outlet_new(&x->x_obj, &s_float); } pd_bind(&x->x_obj.ob_pd, ctlin_sym); return (x); } static void ctlin_list(t_ctlin *x, t_symbol *s, int argc, t_atom *argv) { t_float ctlnumber = atom_getfloatarg(0, argc, argv); t_float value = atom_getfloatarg(1, argc, argv); t_float channel = atom_getfloatarg(2, argc, argv); if (x->x_ctlno >= 0 && x->x_ctlno != ctlnumber) return; if (x->x_channel > 0 && x->x_channel != channel) return; if (x->x_channel == 0) outlet_float(x->x_outlet3, channel); if (x->x_ctlno < 0) outlet_float(x->x_outlet2, ctlnumber); outlet_float(x->x_outlet1, value); } static void ctlin_free(t_ctlin *x) { pd_unbind(&x->x_obj.ob_pd, ctlin_sym); } void ctlin_setup(void) { ctlin_class = class_new(gensym("ctlin"), (t_newmethod)ctlin_new, (t_method)ctlin_free, sizeof(t_ctlin), CLASS_NOINLET, A_GIMME, 0); class_addlist(ctlin_class, ctlin_list); class_sethelpsymbol(ctlin_class, gensym("midi")); ctlin_sym = gensym("#ctlin"); }