andrew@1: /** andrew@1: @file andrew@1: Bonzo - a max object shell andrew@1: jeremy bernstein - jeremy@bootsquad.com andrew@1: andrew@1: @ingroup examples andrew@1: */ andrew@1: andrew@1: #include "ext.h" // standard Max include, always required andrew@1: #include "ext_obex.h" // required for new style Max object andrew@1: //#include "BKeeperlass.h" andrew@1: andrew@1: ////////////////////////// object struct andrew@1: andrew@1: andrew@1: typedef struct _Bonzo andrew@1: { andrew@1: t_object ob; // the object itself (must be first) andrew@1: // BonzoClass* bk; andrew@1: // void* clickclock; andrew@1: // void* bangOut; andrew@1: void* tatumEstimateOut; andrew@1: // void* latencyOut; andrew@1: andrew@1: andrew@1: } t_Bonzo; andrew@1: andrew@1: ///////////////////////// function prototypes andrew@1: //// standard set andrew@1: void *Bonzo_new(t_symbol *s, long argc, t_atom *argv); andrew@1: void Bonzo_bang(t_Bonzo *x); andrew@1: void Bonzo_reset(t_Bonzo *x); andrew@1: void Bonzo_click(t_Bonzo *x); andrew@1: void Bonzo_kick(t_Bonzo *x); andrew@1: void Bonzo_snare(t_Bonzo *x); andrew@1: void Bonzo_kickstart(t_Bonzo *x, int kicks); andrew@1: void Bonzo_latency(t_Bonzo *x, int latency); andrew@1: void Bonzo_fix_latency(t_Bonzo *x, int fix_latency_mode); andrew@1: andrew@1: void Bonzo_setTatum(t_Bonzo *x, double f); andrew@1: void Bonzo_free(t_Bonzo *x); andrew@1: void Bonzo_printtime(t_Bonzo *x); andrew@1: void Bonzo_assist(t_Bonzo *x, void *b, long m, long a, char *s); andrew@1: andrew@1: //////////////////////// global class pointer variable andrew@1: void *Bonzo_class; andrew@1: andrew@1: andrew@1: int main(void) andrew@1: { andrew@1: // object initialization, OLD STYLE andrew@1: // setup((t_messlist **)&Bonzo_class, (method)Bonzo_new, (method)Bonzo_free, (short)sizeof(t_Bonzo), andrew@1: // 0L, A_GIMME, 0); andrew@1: // addmess((method)Bonzo_assist, "assist", A_CANT, 0); andrew@1: andrew@1: // object initialization, NEW STYLE andrew@1: t_class *c; andrew@1: andrew@1: c = class_new("Bonzo", (method)Bonzo_new, (method)Bonzo_free, (long)sizeof(t_Bonzo), andrew@1: 0L /* leave NULL!! */, A_GIMME, 0); andrew@1: andrew@1: /* you CAN'T call this from the patcher */ andrew@1: class_addmethod(c, (method)Bonzo_assist, "assist", A_CANT, 0); andrew@1: class_addmethod(c, (method) Bonzo_bang, "bang", 0); andrew@1: class_addmethod(c, (method) Bonzo_click, "click", 0); andrew@1: class_addmethod(c, (method) Bonzo_kick, "kick", 0); andrew@1: class_addmethod(c, (method) Bonzo_snare, "snare", 0); andrew@1: class_addmethod(c, (method) Bonzo_kickstart, "kickstart", A_LONG, 0); andrew@1: class_addmethod(c, (method) Bonzo_fix_latency, "fix_latency", A_LONG, 0); andrew@1: class_addmethod(c, (method) Bonzo_latency, "latency", A_LONG, 0); andrew@1: andrew@1: class_addmethod(c, (method) Bonzo_setTatum, "set_tatum", A_FLOAT, 0); andrew@1: andrew@1: andrew@1: class_addmethod(c, (method) Bonzo_reset, "reset", 0); andrew@1: class_register(CLASS_BOX, c); /* CLASS_NOBOX */ andrew@1: Bonzo_class = c; andrew@1: andrew@2: post("I am the BONZO max external object"); andrew@1: return 0; andrew@1: } andrew@1: andrew@1: void Bonzo_assist(t_Bonzo *x, void *b, long m, long a, char *s) andrew@1: { andrew@1: if (m == ASSIST_INLET) { // inlet andrew@1: sprintf(s, " BONZO Inlet takes messages for click, kick and snare %ld", a); andrew@1: } andrew@1: else { // outlet andrew@1: sprintf(s, "BONZO Outlet is duration of an eighth note in milliseconds required to synchronise the click track to the drum events %ld", a); andrew@1: } andrew@1: } andrew@1: andrew@1: void Bonzo_free(t_Bonzo *x) andrew@1: { andrew@1: // object_free(x->clickclock);; andrew@1: } andrew@1: andrew@1: andrew@1: andrew@1: void Bonzo_bang(t_Bonzo *x){ andrew@1: andrew@1: andrew@1: object_post((t_object *)x, "Bonzo got banggggg!"); andrew@1: //x->bk->bang(0); andrew@1: andrew@1: andrew@1: /* andrew@1: if (x->timer->send_start_bang){ andrew@1: clock_fdelay(x->clickclock, x->timer->start_delay); andrew@1: x->timer->send_start_bang = false; andrew@1: } andrew@1: */ andrew@1: } andrew@1: andrew@1: void Bonzo_kick(t_Bonzo *x){ andrew@1: // x->bk->bang(0); andrew@1: post("BONZO kick"); andrew@1: // outlet_float(x->tatumEstimateOut, x->bk->main_tatum_output); andrew@1: } andrew@1: andrew@1: void Bonzo_snare(t_Bonzo *x){ andrew@1: // x->bk->bang(2); andrew@1: post("Bonzo SNARE"); andrew@1: // outlet_float(x->tatumEstimateOut, x->bk->main_tatum_output); andrew@1: } andrew@1: andrew@1: void Bonzo_click(t_Bonzo *x){ andrew@1: // x->bk->bang(1); andrew@2: post("Bonzo Click"); andrew@1: // outlet_float(x->tatumEstimateOut, x->bk->main_tatum_output); andrew@1: } andrew@1: andrew@1: andrew@1: void Bonzo_reset(t_Bonzo *x){ andrew@1: // object_post((t_object *)x, "B-Keeper reset!"); andrew@1: // x->bk->reset(); andrew@1: } andrew@1: andrew@1: andrew@1: andrew@1: void Bonzo_kickstart(t_Bonzo *x, int kicks){ andrew@1: // if (kicks >= 0 && kicks <= 8){ andrew@1: // x->timer->start_index = kicks; andrew@1: // } andrew@1: } andrew@1: andrew@1: void Bonzo_setTatum(t_Bonzo *x, double f){ andrew@1: post("Bonzo set tatum called with arg %f\n", f); andrew@1: // x->bk->setTatum(f); andrew@1: } andrew@1: andrew@1: andrew@1: void Bonzo_latency(t_Bonzo *x, int latency){ andrew@1: //if (latency >= 0 && latency < 100) andrew@1: // x->timer->latency = latency; andrew@1: } andrew@1: andrew@1: void Bonzo_fix_latency(t_Bonzo *x, int fix_latency_mode){ andrew@1: /* andrew@1: if (fix_latency_mode == 1){ andrew@1: x->timer->saved_latency_mode = true; andrew@1: x->timer->saved_latency = x->timer->latency; andrew@1: post("Latency FIXED at %i msec \n", x->timer->latency); andrew@1: } andrew@1: else{ andrew@1: x->timer->saved_latency_mode = false; andrew@1: post("Latency to be calculated from ableton click track arriving...now at %i ms\n", x->timer->latency); andrew@1: } andrew@1: */ andrew@1: } andrew@1: andrew@1: void Bonzo_printtime(t_Bonzo *x) andrew@1: { andrew@1: // double time; andrew@1: // sched_getftime(&time); andrew@1: // post("instance %lx is executing at time %.2f", x, time); andrew@1: andrew@1: long timeMillis = gettime(); andrew@1: post("current time is %ld \n", timeMillis); andrew@1: andrew@1: } andrew@1: andrew@1: /* andrew@1: A_GIMME signature = andrew@1: t_symbol *s objectname andrew@1: long argc num additonal args andrew@1: t_atom *argv array of t_atom structs andrew@1: type = argv->a_type andrew@1: if (type == A_LONG) ; andrew@1: else if (type == A_FLOAT) ; andrew@1: else if (type == A_SYM) ; andrew@1: */ andrew@1: /* andrew@1: t_symbol { andrew@1: char *s_name; andrew@1: t_object *s_thing; andrew@1: } andrew@1: */ andrew@1: void *Bonzo_new(t_symbol *s, long argc, t_atom *argv) andrew@1: { andrew@1: t_Bonzo *x = NULL; andrew@1: //long i; andrew@1: andrew@1: // object instantiation, OLD STYLE andrew@1: // if (x = (t_Bonzo *)newobject(Bonzo_class)) { andrew@1: // ; andrew@1: // } andrew@1: andrew@1: // object instantiation, NEW STYLE andrew@1: if (x = (t_Bonzo *)object_alloc((t_class *) Bonzo_class)) { andrew@1: //(t_class *) allows this to be a cpp file andrew@1: andrew@1: // object_post((t_object *)x, "a new %s object was instantiated: 0x%X", s->s_name, x); andrew@1: // object_post((t_object *)x, "it has %ld arguments", argc); andrew@1: andrew@1: /* andrew@1: for (i = 0; i < argc; i++) { andrew@1: if ((argv + i)->a_type == A_LONG) { andrew@1: object_post((t_object *)x, "arg %ld: long (%ld)", i, atom_getlong(argv+i)); andrew@1: } else if ((argv + i)->a_type == A_FLOAT) { andrew@1: object_post((t_object *)x, "arg %ld: float (%f)", i, atom_getfloat(argv+i)); andrew@1: } else if ((argv + i)->a_type == A_SYM) { andrew@1: object_post((t_object *)x, "arg %ld: symbol (%s)", i, atom_getsym(argv+i)->s_name); andrew@1: } else { andrew@1: object_error((t_object *)x, "forbidden argument"); andrew@1: } andrew@1: } andrew@1: */ andrew@1: andrew@1: andrew@1: // x->bk = new BonzoClass();//imer = new clicktimer(); andrew@1: // x->clickclock = clock_new((t_object *)x, (method) Bonzo_sendDelayedBang); andrew@1: // x->latencyOut = intout((t_object *)x); andrew@1: x->tatumEstimateOut = floatout((t_object *)x); andrew@1: // x->bangOut = bangout((t_object *)x); andrew@1: } andrew@1: return (x); andrew@1: }