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;
							 | 
						||
| 
								 | 
							
								}
							 |