112 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			112 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|   | //*****************************************//
 | ||
|  | //  cmidiin.cpp
 | ||
|  | //  by Gary Scavone, 2003-2004.
 | ||
|  | //
 | ||
|  | //  Simple program to test MIDI input and
 | ||
|  | //  use of a user callback function.
 | ||
|  | //
 | ||
|  | //*****************************************//
 | ||
|  | 
 | ||
|  | #include <iostream>
 | ||
|  | #include <cstdlib>
 | ||
|  | #include "RtMidi.h"
 | ||
|  | 
 | ||
|  | void usage( void ) { | ||
|  |   // Error function in case of incorrect command-line
 | ||
|  |   // argument specifications.
 | ||
|  |   std::cout << "\nuseage: cmidiin <port>\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<nBytes; i++ ) | ||
|  |     std::cout << "Byte " << i << " = " << (int)message->at(i) << ", "; | ||
|  |   if ( nBytes > 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 <enter> 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; i<nPorts; i++ ) { | ||
|  |       portName = rtmidi->getPortName(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; | ||
|  | } |