#include #include #include #include #include #include #include #include #include #include #include #define X 0 #define Y 1 #define Z 2 #define XSIZE 4 #define ZSIZE 8 /*** (^_^;) Bug Recovery of SGI Media Library --> Original MIDI Defines !! (^_^;) ***/ #define MES(x) ( (x[0]).mm.msgbuf ) #define midi_set_status(x,d) ( MES(x) = ( ( d > 0xbf ) && ( d < 0xe0 ) ) ? 0x40000000 : 0x60000000, \ MES(x) &= 0xff0fffff, MES(x) |= ( ( d & 0xf0 ) << 16 ) ) #define midi_set_channel(x,d) ( MES(x) &= 0xfff0ffff, MES(x) |= ( ( d & 0x0f ) << 16 ) ) #define midi_set_keyno(x,d) ( MES(x) &= 0xffff00ff, MES(x) |= ( ( d & 0x7f ) << 8 ) ) #define midi_set_velocity(x,d) ( MES(x) &= 0xffffff00, MES(x) |= ( d & 0x7f ) ) int event_counter = 0; int xspeed = 0, zspeed = 0, interval = 10, sc_x, sc_y, j = 0; XtAppContext app_context; MIport *midi_port; MIevent midi[10000]; double pos[300][3], vert[300][4][3], cl[300][3]; long background[3] = { 0, 0, 0 }; GLXconfig glxConfig [] = { { GLX_NORMAL, GLX_DOUBLE, TRUE }, { GLX_NORMAL, GLX_RGB, TRUE }, { GLX_NORMAL, GLX_ZSIZE, GLX_NOCONFIG }, { 0, 0, 0 } }; void init_window(); void do_resize(); void set_inc(); void set_rot(); void quit(); void handle_timeout(); void midi_initialize(); void midi_event_check(); void midi_transmit(); void midi_tx_3byte(); main(int argc, char **argv) { Arg args[20]; int n; Widget glw, toplevel, form, frame, slider1, slider2, pushb; midi_initialize(); toplevel = XtAppInitialize(&app_context, "", (XrmOptionDescList)NULL , 0, (Cardinal*)&argc, (String*)argv, (String*)NULL, (ArgList)NULL, 0); n = 0; XtSetArg(args[n], XtNwidth, 750); n++; XtSetArg(args[n], XtNheight, 700); n++; form = XtCreateManagedWidget("", xmFormWidgetClass, toplevel, args, n); n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNtopOffset, 10); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNleftOffset, 30); n++; pushb = XtCreateManagedWidget("Quit", xmPushButtonWidgetClass, form, args, n); XtAddCallback(pushb, XmNactivateCallback, quit,0); n = 0; XtSetArg(args[n], XtNwidth, 20); n++; XtSetArg(args[n], XtNheight, 420); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNtopWidget, pushb); n++; XtSetArg(args[n], XmNtopOffset, 10); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNrightOffset, 30); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomOffset, 30); n++; XtSetArg(args[n], XmNminimum, -100); n++; XtSetArg(args[n], XmNmaximum, 100); n++; XtSetArg(args[n], XmNvalue, xspeed); n++; XtSetArg(args[n], XmNsliderSize, 25); n++; XtSetArg(args[n], XmNincrement, 1); n++; XtSetArg(args[n], XmNpageIncrement, 10); n++; XtSetArg(args[n], XmNvalue, 0); n++; slider2 = XtCreateManagedWidget("", xmScrollBarWidgetClass, form, args, n); XtAddCallback(slider2, XmNdecrementCallback, set_inc,0); XtAddCallback(slider2, XmNincrementCallback, set_inc,0); XtAddCallback(slider2, XmNdragCallback, set_inc,0); XtAddCallback(slider2, XmNpageIncrementCallback, set_inc,0); XtAddCallback(slider2, XmNpageDecrementCallback, set_inc,0); n = 0; XtSetArg(args[n], XtNwidth, 20); n++; XtSetArg(args[n], XtNheight, 420); n++; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNtopWidget, pushb); n++; XtSetArg(args[n], XmNtopOffset, 10); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNrightWidget, slider2); n++; XtSetArg(args[n], XmNrightOffset, 20); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomOffset, 30); n++; XtSetArg(args[n], XmNminimum, -100); n++; XtSetArg(args[n], XmNmaximum, 100); n++; XtSetArg(args[n], XmNvalue, zspeed); n++; XtSetArg(args[n], XmNsliderSize, 25); n++; XtSetArg(args[n], XmNincrement, 1); n++; XtSetArg(args[n], XmNpageIncrement, 10); n++; XtSetArg(args[n], XmNvalue, 0); n++; slider1 = XtCreateManagedWidget("", xmScrollBarWidgetClass, form, args, n); XtAddCallback(slider1, XmNdecrementCallback, set_rot,0); XtAddCallback(slider1, XmNincrementCallback, set_rot,0); XtAddCallback(slider1, XmNdragCallback, set_rot,0); XtAddCallback(slider1, XmNpageIncrementCallback, set_rot,0); XtAddCallback(slider1, XmNpageDecrementCallback, set_rot,0); n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNtopWidget, pushb); n++; XtSetArg(args[n], XmNtopOffset, 10); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNleftOffset, 30); n++; XtSetArg(args[n], XmNrightAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNrightWidget, slider1); n++; XtSetArg(args[n], XmNrightOffset, 25); n++; XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNbottomOffset, 30); n++; XtSetArg(args[n], XmNshadowType, XmSHADOW_IN); n++; frame = XtCreateManagedWidget("", xmFrameWidgetClass, form, args, n); n = 0; XtSetArg(args[n], GlxNglxConfig, glxConfig); n++; glw = XtCreateManagedWidget("", glxMDrawWidgetClass, frame, args, n); XtAddCallback(glw, GlxNresizeCallback, do_resize, 0); XtAddCallback(glw, GlxNginitCallback, init_window, 0); XtAppAddTimeOut(app_context, interval, handle_timeout, glw); WidgetBackgroundToGlC3i(glw,background); XtRealizeWidget(toplevel); installColormap(toplevel,glw); XtAppMainLoop(app_context); } static void quit(Widget w, caddr_t client_data, caddr_t call_data) { MIclose( midi_port ); MIfreeport( midi_port ); exit (0); } static void init_window(Widget w, caddr_t client_data, GlxDrawCallbackStruct *call_data) { xspeed = zspeed = 0; srandom( time(NULL) ); RGBmode(); RGBcolor(0,0,0); clear(); doublebuffer(); blendfunction(BF_ONE, BF_MDC); mmode(MVIEWING); perspective(900,1,-100,0); lookat (0,0,0,0,0,0,0); GLXwinset(XtDisplay(w), XtWindow(w)); sc_x = (Screencoord)call_data->width; sc_y = (Screencoord)call_data->height; viewport(0, sc_x-1, 0, sc_y-1); } static void do_resize(Widget w, caddr_t client_data, GlxDrawCallbackStruct *call_data) { GLXwinset(XtDisplay(w), XtWindow(w)); sc_x = (Screencoord)call_data->width; sc_y = (Screencoord)call_data->height; viewport(0, sc_x-1, 0, sc_y-1); } static void set_inc(Widget w, caddr_t client_data, XmScrollBarCallbackStruct *call_data) { xspeed = call_data->value; } static void set_rot(Widget w, caddr_t client_data, XmScrollBarCallbackStruct *call_data) { zspeed = call_data->value; } static void midi_initialize() { int retval; MIconfig *c; c = MInewconfig(); midi_port = MInewport(); retval = MIopen( midi_port, "rw", &c ); if( retval < 0 ) exit(-1); } static void midi_transmit( int status, int channel, int keyno, int velocity ) { midi_set_status( midi, ( status & 0xf0 ) ); midi_set_channel( midi, ( channel & 0x0f ) ); midi_set_keyno( midi, ( keyno & 0x7f ) ); midi_set_velocity ( midi, ( velocity & 0x7f ) ); if( MIsend( midi_port, midi, 1 ) < 0 ) exit(-1); } static void midi_tx_3byte( int status_byte, int keyno, int velocity ) { midi_transmit( ( status_byte & 0xf0 ), ( status_byte & 0x0f ), keyno, velocity ); } static void handle_timeout(Widget w) { int i, co, s; XtAppAddTimeOut(app_context, interval, handle_timeout, w); GLXwinset(XtDisplay(w), XtWindow(w)); if((j++)>299) j=0; pos[j][X] = (random()%1001)/1000.0 * 400 - 200; pos[j][Y] = (random()%1001)/1000.0 * 400 - 200; pos[j][Z] = -1500; for(i=0; i<3; i++) cl[j][i] = (random()%1001)/1000.0 * 100 +30; for(co=0; co<3; co++){ RGBcolor(0,0,0); clear(); rotate (xspeed/4, 'y'); rotate (zspeed, 'z'); for(s=0; s<300; s++){ vert[s][0][X] = vert[s][1][X] = pos[s][X] - XSIZE; vert[s][0][Z] = vert[s][3][Z] = pos[s][Z] + ZSIZE; vert[s][2][X] = vert[s][3][X] = pos[s][X] + XSIZE; vert[s][1][Z] = vert[s][2][Z] = pos[s][Z] - ZSIZE; for(i=0; i<4; i++) vert[s][i][Y] = pos[s][Y]; RGBcolor (cl[s][0],cl[s][1],cl[s][2]); bgnpolygon(); for(i=0; i<4; i++) v3d(vert[s][i]); endpolygon(); pos[s][Z] += 5; } swapbuffers(); } gflush(); midi_event_check(); } static void midi_event_check() { event_counter = (event_counter++) % 50; if(event_counter == 1){ midi_tx_3byte( 0x90, 60, 127 ); } else if(event_counter == 10){ midi_tx_3byte( 0x90, 60, 0 ); } }