#include #include #include #include #include #include #include #include /*** (^_^;) Bug Recovery of SGI Media Library --> Original MIDI Defines !! (^_^;) ***/ #define MES(x) ( (x[0]).mm.msgbuf ) #define midi_get_status(x) ( ( ( ( MES(x) & 0xff000000 ) == 0x60000000 ) || \ ( ( MES(x) & 0xff000000 ) == 0x40000000 ) ) ? \ ( ( MES(x) & 0x0f00000 ) >> 16 ) : 0 ) /* Serial Port #2 Only ! */ #define midi_get_channel(x) ( ( MES(x) & 0x00f0000 ) >> 16 ) /* 1 - 16 channel Only ! */ #define midi_get_keyno(x) ( ( MES(x) & 0x0007f00 ) >> 8 ) /* device ID : #1 Only ! */ #define midi_get_velocity(x) ( ( MES(x) & 0x000007f ) ) #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 ) ) static unsigned char status, channel, keyno, velocity; int retval; MIport *midi_port; MIevent midi[10000]; void midi_initialize(); int midi_receive(); int midi_transmit(); void main(unsigned int argc, char** argv) { int count = 0; midi_initialize(); printf("\nLet's start MIDI! (^_^)/\n\n"); schedctl(NDPRI, 0, NDPNORMMAX); while(1){ retval = midi_receive(); if( retval > 0 ){ if( (status==0x90)&&(velocity!=0) ) count++; if( (status==0x90)&&(velocity==0) ) count--; fprintf(stderr," %d ", count ); retval = midi_transmit(); if( retval < 0 ) exit(-1); } } MIclose( midi_port ); MIfreeport( midi_port ); } void midi_initialize() { MIconfig *c; c = MInewconfig(); midi_port = MInewport(); retval = MIopen( midi_port, "rw", &c ); if( retval < 0 ) exit(-1); } int midi_receive() { retval = MIreceive( midi_port, midi, 1 ); if( retval > 0 ){ status = midi_get_status( midi ); if( ( status > 0xef ) || ( status < 0x80 ) ) return(0); channel = midi_get_channel( midi ); keyno = midi_get_keyno( midi ); if( ( status > 0xbf ) && ( status < 0xe0 ) ) return(2); velocity = midi_get_velocity( midi ); return(3); } return(retval); } int midi_transmit() { midi_set_status( midi, status ); midi_set_channel( midi, channel ); midi_set_keyno( midi, keyno ); midi_set_velocity ( midi, velocity ); return( MIsend( midi_port, midi, 1 ) ); }