99 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			99 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|   | //*****************************************//
 | ||
|  | //  qmidiin.cpp
 | ||
|  | //  by Gary Scavone, 2003-2004.
 | ||
|  | //
 | ||
|  | //  Simple program to test MIDI input and
 | ||
|  | //  retrieval from the queue.
 | ||
|  | //
 | ||
|  | //*****************************************//
 | ||
|  | 
 | ||
|  | #include <iostream>
 | ||
|  | #include <cstdlib>
 | ||
|  | #include <signal.h>
 | ||
|  | #include "RtMidi.h"
 | ||
|  | 
 | ||
|  | // Platform-dependent sleep routines.
 | ||
|  | #if defined(WIN32)
 | ||
|  |   #include <windows.h>
 | ||
|  |   #define SLEEP( milliseconds ) Sleep( (DWORD) milliseconds ) 
 | ||
|  | #else // Unix variants
 | ||
|  |   #include <unistd.h>
 | ||
|  |   #define SLEEP( milliseconds ) usleep( (unsigned long) (milliseconds * 1000.0) )
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | bool done; | ||
|  | static void finish( int /*ignore*/ ){ done = true; } | ||
|  | 
 | ||
|  | void usage( void ) { | ||
|  |   // Error function in case of incorrect command-line
 | ||
|  |   // argument specifications.
 | ||
|  |   std::cout << "\nusage: qmidiin <port>\n"; | ||
|  |   std::cout << "    where port = the device to use (first / default = 0).\n\n"; | ||
|  |   exit( 0 ); | ||
|  | } | ||
|  | 
 | ||
|  | int main( int argc, char *argv[] ) | ||
|  | { | ||
|  |   RtMidiIn *midiin = 0; | ||
|  |   std::vector<unsigned char> message; | ||
|  |   int nBytes, i; | ||
|  |   double stamp; | ||
|  | 
 | ||
|  |   // Minimal command-line check.
 | ||
|  |   if ( argc > 2 ) usage(); | ||
|  | 
 | ||
|  |   // RtMidiIn constructor
 | ||
|  |   try { | ||
|  |     midiin = new RtMidiIn(); | ||
|  |   } | ||
|  |   catch ( RtMidiError &error ) { | ||
|  |     error.printMessage(); | ||
|  |     exit( EXIT_FAILURE ); | ||
|  |   } | ||
|  | 
 | ||
|  |   // Check available ports vs. specified.
 | ||
|  |   unsigned int port = 0; | ||
|  |   unsigned int nPorts = midiin->getPortCount(); | ||
|  |   if ( argc == 2 ) port = (unsigned int) atoi( argv[1] ); | ||
|  |   if ( port >= nPorts ) { | ||
|  |     delete midiin; | ||
|  |     std::cout << "Invalid port specifier!\n"; | ||
|  |     usage(); | ||
|  |   } | ||
|  | 
 | ||
|  |   try { | ||
|  |     midiin->openPort( port ); | ||
|  |   } | ||
|  |   catch ( RtMidiError &error ) { | ||
|  |     error.printMessage(); | ||
|  |     goto cleanup; | ||
|  |   } | ||
|  | 
 | ||
|  |   // Don't ignore sysex, timing, or active sensing messages.
 | ||
|  |   midiin->ignoreTypes( false, false, false ); | ||
|  | 
 | ||
|  |   // Install an interrupt handler function.
 | ||
|  |   done = false; | ||
|  |   (void) signal(SIGINT, finish); | ||
|  | 
 | ||
|  |   // Periodically check input queue.
 | ||
|  |   std::cout << "Reading MIDI from port " << midiin->getPortName() << " ... quit with Ctrl-C.\n"; | ||
|  |   while ( !done ) { | ||
|  |     stamp = midiin->getMessage( &message ); | ||
|  |     nBytes = message.size(); | ||
|  |     for ( i=0; i<nBytes; i++ ) | ||
|  |       std::cout << "Byte " << i << " = " << (int)message[i] << ", "; | ||
|  |     if ( nBytes > 0 ) | ||
|  |       std::cout << "stamp = " << stamp << std::endl; | ||
|  | 
 | ||
|  |     // Sleep for 10 milliseconds.
 | ||
|  |     SLEEP( 10 ); | ||
|  |   } | ||
|  | 
 | ||
|  |   // Clean up
 | ||
|  |  cleanup: | ||
|  |   delete midiin; | ||
|  | 
 | ||
|  |   return 0; | ||
|  | } |