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