// // Modified By: Craig Stuart Sapp // Creation Date: Sat Mar 1 13:11:40 PST 2003 // Last Modified: Sat Mar 1 13:11:43 PST 2003 // Filename: mymakenote.c // Web Address: http://peabody.sapp.org/class/dmp2/lab/mymakenote/mymakenote.c // Syntax: C; Max4/MSP2 External Object; CodeWarrior 6.0 // OS: Mac OS 9; PPC // // Description: Demonstration of how to do same thing as makenote object. // // Note: Not finished // #include "ext.h" typedef struct { t_object max_data; // must always be the first field; used by Max void* clock; // clock data structure pointer long duration; // duration of note long invel; // input velocity void* outputKeyNumber; // outlet 1 for key number void* outputVelocity; // outlet 2 for key velocity } MyObject; void* object_data; // pointer to data for object (created in setup()); // function declarations: void main (void); void* create_object (long defaultDuration); void destroy_object (MyObject *mo); void InputKeyNumber (MyObject* mo, long value); void InputVelocity (MyObject* mo, long value); void InputDuration (MyObject* mo, long value); void ClockTick (MyObject *mo); void MessageOff (MyObject *mo); ////////////////////////////////////////////////////////////////////////// // // Initialization functions: // void main(void) { setup((t_messlist**)&object_data, (method)create_object, (method)destroy_object, (short)sizeof(MyObject), NULL, A_DEFLONG, A_NOTHING); addbang((method)MessageOff); addint((method)InputKeyNumber); addinx((method)InputVelocity, 2); addinx((method)InputDuration, 1); addmess((method)MessageOff, "off", A_NOTHING); } ////////////////////////////// // // create_object -- // void* create_object(long defaultDuration) { MyObject *mo = (MyObject*)newobject(object_data); mo->clock = clock_new(mo, (method)ClockTick); mo->duration = defaultDuration; mo->outputVelocity = bangout(mo); mo->outputKeyNumber = bangout(mo); intin(mo, 1); intin(mo, 2); return mo; } ////////////////////////////// // // destroy_object -- what to do when the object is deleted from the patch. // In this case, you must free the clock object. // void destroy_object(MyObject *mo) { freeobject((t_object*)mo->clock); } ////////////////////////////////////////////////////////////////////////// // // Behavior functions: // ////////////////////////////// // // InputBang -- What to do when a bang message arrives into the object: // if a bang is received from the object input, then send out a bang. // void InputBang(MyObject* mo) { clock_fdelay(mo->clock, 0.0); } ////////////////////////////// // // InputDuration -- // void InputDuration(MyObject* mo, float value) { if (value < 1.0) { value = 1.0; } mo->duration = value; } ////////////////////////////// // // ClockTick -- what to do when the event scheduler is ready. // void ClockTick(MyObject *mo) { clock_fdelay(mo->clock, mo->duration); // schedule another metronome tick outlet_bang(mo->output); // send out a bang message } ////////////////////////////// // // MessageOff -- what to do when an "off" message arrives. // void MessageOff(MyObject *mo) { clock_unset(mo->clock); }