#include #include #include #include #include #include #include #include #include #define XS 100 #define YS 100 /*** (^_^;) 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 ) ) MIport *midi_port; MIevent midi[100]; int interval = 10, st = 5, mx, my, sc_x, sc_y, sp = 3, spp = 0, mode = 0, sst, ssp, mmx, mmy; XtAppContext app_context; int vert[8][4][3] = { 110,110,0,10,110,0,10,10,0,110,10,0,-110,110,0,-10,110,0,-10,10,0,-110,10,0, 110,-110,0,10,-110,0,10,-10,0,110,-10,0,-110,-110,0,-10,-110,0,-10,-10,0,-110,-10,0, -220,-220,0,-120,-220,0,-120,-120,0,-220,-120,0,220,220,0,120,220,0,120,120,0,220,120,0, -220,220,0,-120,220,0,-120,120,0,-220,120,0,220,-220,0,120,-220,0,120,-120,0,220,-120,0 }; int vcolor[8][3] = { 30,30,255,255,30,30,255,30,30,30,30,255,210,250,50,210,250,50,210,250,50,210,250,50 }; int t_mpy[8] = { 1,1,1,1,3,3,3,3 }; int t_sgn[4][8] = { 1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1 }; 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(), do_resize(), input(), set_inc(), set_rot(), quit(), handle_timeout(), sound_on(), sound_off(); void midi_initialize(), midi_event_generate(), midi_transmit(), midi_tx_3byte(), midi_tx_2byte(); main(int argc, char **argv) { Arg args[20]; int n; Widget glw, toplevel, form, frame, slider1, slider2, pushb[3]; 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[0] = XtCreateManagedWidget("Quit", xmPushButtonWidgetClass, form, args, n); XtAddCallback(pushb[0], XmNactivateCallback, quit,0); n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNtopOffset, 10); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNleftWidget, pushb[0]); n++; XtSetArg(args[n], XmNleftOffset, 20); n++; pushb[1] = XtCreateManagedWidget("Sound Off", xmPushButtonWidgetClass, form, args, n); XtAddCallback(pushb[1], XmNactivateCallback, sound_off,0); n = 0; XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg(args[n], XmNtopOffset, 10); n++; XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++; XtSetArg(args[n], XmNleftWidget, pushb[1]); n++; XtSetArg(args[n], XmNleftOffset, 20); n++; pushb[2] = XtCreateManagedWidget("Sound On", xmPushButtonWidgetClass, form, args, n); XtAddCallback(pushb[2], XmNactivateCallback, sound_on,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[0]); 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, -375); n++; XtSetArg(args[n], XmNmaximum, 400); n++; XtSetArg(args[n], XmNvalue, st); n++; XtSetArg(args[n], XmNsliderSize, 25); n++; XtSetArg(args[n], XmNincrement, 1); n++; XtSetArg(args[n], XmNpageIncrement, 10); n++; XtSetArg(args[n], XmNvalue, -20); 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[0]); 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, -175); n++; XtSetArg(args[n], XmNmaximum, 200); n++; XtSetArg(args[n], XmNvalue, sp); 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[0]); 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); XtAddCallback(glw, GlxNinputCallback, input, 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) { midi_tx_2byte( 0xdf, 0 ); MIclose( midi_port ); MIfreeport( midi_port ); exit (0); } static void init_window(Widget w, caddr_t client_data, caddr_t call_data) { do_resize(w); RGBmode(); RGBcolor(0,0,0); clear(); doublebuffer(); blendfunction(BF_ONE, BF_MDC); mmode(MVIEWING); perspective(900,1,-100,0); lookat (0,0,500,0,0,0,0); midi_initialize(); } static void do_resize(Widget w, caddr_t client_data, GlxDrawCallbackStruct *call_data) { sp = 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 input(Widget w, caddr_t client_data, GlxDrawCallbackStruct *call_data) { char buffer[1]; switch(call_data->event->type){ case ButtonPress: switch(call_data->event->xbutton.button){ case Button1: mx = call_data->event->xbutton.x - sc_x/2; my = call_data->event->xbutton.y - sc_y/2; scale_change(); break; } break; case MotionNotify: if (call_data->event->xmotion.state & Button1Mask){ mx = call_data->event->xbutton.x - sc_x/2; my = call_data->event->xbutton.y - sc_y/2; scale_change(); } break; } } static void handle_timeout(Widget w) { int i,j; XtAppAddTimeOut(app_context, interval, handle_timeout, w); GLXwinset(XtDisplay(w), XtWindow(w)); RGBcolor(0,0,0); clear(); rotate (st,'y'); for(i=0;i<4;i++){ RGBcolor(vcolor[i][0],vcolor[i][1],vcolor[i][2]); bgnpolygon(); for(j=0;j<4;j++) v3i(vert[i][j]); endpolygon(); } pushmatrix(); rotate (spp,'z'); for(i=4;i<8;i++){ RGBcolor(vcolor[i][0],vcolor[i][1],vcolor[i][2]); bgnpolygon(); for(j=0;j<4;j++) v3i(vert[i][j]); endpolygon(); } popmatrix(); spp = spp + sp; swapbuffers(); gflush(); } static void midi_initialize() { MIconfig *c; c = MInewconfig(); midi_port = MInewport(); if( MIopen( midi_port, "rw", &c ) < 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 midi_tx_2byte( int status_byte, int param ) { midi_transmit( ( status_byte & 0xf0 ), ( status_byte & 0x0f ), param, 0 ); } static void sound_on(Widget w, caddr_t client_data, caddr_t call_data) { if(mode == 0){ mode = 1; midi_tx_2byte( 0xdf, 1 ); } } static void sound_off(Widget w, caddr_t client_data, caddr_t call_data) { if(mode != 0){ mode = 0; midi_tx_2byte( 0xdf, 0 ); } } scale_change() { int i; for(i=0;i<8;i++){ vert[i][0][0] = t_sgn[i%4][0] * mx * t_mpy[i] - XS/2; vert[i][0][1] = t_sgn[i%4][1] * my * t_mpy[i] + YS/2; vert[i][1][0] = t_sgn[i%4][2] * mx * t_mpy[i] - XS/2; vert[i][1][1] = t_sgn[i%4][3] * my * t_mpy[i] - YS/2; vert[i][2][0] = t_sgn[i%4][4] * mx * t_mpy[i] + XS/2; vert[i][2][1] = t_sgn[i%4][5] * my * t_mpy[i] - YS/2; vert[i][3][0] = t_sgn[i%4][6] * mx * t_mpy[i] + XS/2; vert[i][3][1] = t_sgn[i%4][7] * my * t_mpy[i] + YS/2; } mmx = (int)( (mx+sc_x/2) * 128 / sc_x ); if( mmx<0 ) mmx = 0; else if( mmx>127 ) mmx = 127; mmy = (int)( 127.9 - (my+sc_y/2) * 128 / sc_y ); if( mmy<0 ) mmy = 0; else if( mmy>127 ) mmy = 127; /* printf(" [mx/my] changes : mx = %d, mmx = %d, my = %d mmy = %d\n",mx,mmx,my,mmy); */ midi_tx_3byte( 0xaf, mmx, mmy ); } static void set_inc(Widget w, caddr_t client_data, XmScrollBarCallbackStruct *call_data) { st = call_data->value; if( st == 0 ) sst = 64; else if( st > 0 ) sst = 63 + (int)( 62.9 - (st+375) * 63 / 375 ); else if( st < 0 ) sst = 65 + (int)( 62.9 - (st+375) * 63 / 375 ); /* printf(" [st] changes : st = %d, sst = %d, sp = %d ssp = %d\n",st,sst,sp,ssp); */ midi_tx_3byte( 0xbf, ssp, sst ); } static void set_rot(Widget w, caddr_t client_data, XmScrollBarCallbackStruct *call_data) { sp = call_data->value; if( sp == 0 ) ssp = 64; else if( sp > 0 ) ssp = 63 + (int)( 62.9 - (sp+175) * 63 / 175 ); else if( sp < 0 ) ssp = 65 + (int)( 62.9 - (sp+175) * 63 / 175 ); /* printf(" [sp] changes : st = %d, sst = %d, sp = %d ssp = %d\n",st,sst,sp,ssp); */ midi_tx_3byte( 0xbf, ssp, sst ); }