//*****************************************// // cmidiin.cpp // by Gary Scavone, 2003-2004. // // Simple program to test MIDI input and // use of a user callback function. // //*****************************************// #include #include #include "RtMidi.h" void usage( void ) { // Error function in case of incorrect command-line // argument specifications. std::cout << "\nuseage: cmidiin \n"; std::cout << " where port = the device to use (first / default = 0).\n\n"; exit( 0 ); } void mycallback( double deltatime, std::vector< unsigned char > *message, void */*userData*/ ) { unsigned int nBytes = message->size(); for ( unsigned int i=0; i 0 ) std::cout << "stamp = " << deltatime << std::endl; } // This function should be embedded in a try/catch block in case of // an exception. It offers the user a choice of MIDI ports to open. // It returns false if there are no ports available. bool chooseMidiPort( RtMidiIn *rtmidi ); int main( int argc, char ** /*argv[]*/ ) { RtMidiIn *midiin = 0; // Minimal command-line check. if ( argc > 2 ) usage(); try { // RtMidiIn constructor midiin = new RtMidiIn(); // Call function to select port. if ( chooseMidiPort( midiin ) == false ) goto cleanup; // Set our callback function. This should be done immediately after // opening the port to avoid having incoming messages written to the // queue instead of sent to the callback function. midiin->setCallback( &mycallback ); // Don't ignore sysex, timing, or active sensing messages. midiin->ignoreTypes( false, false, false ); std::cout << "\nReading MIDI input ... press to quit.\n"; char input; std::cin.get(input); } catch ( RtMidiError &error ) { error.printMessage(); } cleanup: delete midiin; return 0; } bool chooseMidiPort( RtMidiIn *rtmidi ) { std::cout << "\nWould you like to open a virtual input port? [y/N] "; std::string keyHit; std::getline( std::cin, keyHit ); if ( keyHit == "y" ) { rtmidi->openVirtualPort(); return true; } std::string portName; unsigned int i = 0, nPorts = rtmidi->getPortCount(); if ( nPorts == 0 ) { std::cout << "No input ports available!" << std::endl; return false; } if ( nPorts == 1 ) { std::cout << "\nOpening " << rtmidi->getPortName() << std::endl; } else { for ( i=0; igetPortName(i); std::cout << " Input port #" << i << ": " << portName << '\n'; } do { std::cout << "\nChoose a port number: "; std::cin >> i; } while ( i >= nPorts ); std::getline( std::cin, keyHit ); // used to clear out stdin } rtmidi->openPort( i ); return true; }