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