#include #include #include #include /*** (^_^;) Bug Recovery of Media Library of SGI --> 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 ) ) void main(unsigned int argc, char** argv) { MIport *midi_port; MIevent midi[10]; MIconfig *mc; unsigned char keyno, velocity, statusbyte; int a, b, c, mode = 0; if(argc<3){ printf("... Data too few (;_;)\n"); exit(-1); } else if(argc==3){ sscanf( argv[1], "%x", &a ); sscanf( argv[2], "%x", &b ); statusbyte = a; keyno = b; velocity = b; if((statusbyte<0xc0)||(statusbyte>0xdf)){ printf("... Bad Data (;_;)\n"); exit(-1); } if(keyno>0x7f){ printf("... Bad Data (;_;)\n"); exit(-1); } mode = 1; } else if(argc==4){ sscanf( argv[1], "%x", &a ); sscanf( argv[2], "%x", &b ); sscanf( argv[3], "%x", &c ); statusbyte = a; keyno = b; velocity = c; if((statusbyte<0x80)||(statusbyte>0xef)){ printf("... Bad Data (;_;)\n"); exit(-1); } if((statusbyte>0xbf)&&(statusbyte<0xe0)){ printf("... Bad Data (;_;)\n"); exit(-1); } if(keyno>0x7f){ printf("... Bad Data (;_;)\n"); exit(-1); } if(velocity>0x7f){ printf("... Bad Data (;_;)\n"); exit(-1); } mode = 2; } else{ printf("... Data too much (;_;)\n"); exit(-1); } mc = MInewconfig(); midi_port = MInewport(); if( MIopen( midi_port, "rw", &mc ) < 0 ) exit(-1); midi_set_status( midi, statusbyte & 0xf0 ); midi_set_channel( midi, statusbyte & 0x0f ); midi_set_keyno( midi, keyno ); midi_set_velocity ( midi, velocity ); MIsend( midi_port, midi, 1 ); MIclose( midi_port ); MIfreeport( midi_port ); if(mode == 1) printf("MIDI: transmit data = %02X %02X\n", statusbyte, keyno ); else if(mode == 2) printf("MIDI: transmit data = %02X %02X %02X\n", statusbyte, keyno, velocity ); }