147 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			147 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								//*****************************************//
							 | 
						||
| 
								 | 
							
								//  midiout.cpp
							 | 
						||
| 
								 | 
							
								//  by Gary Scavone, 2003-2004.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//  Simple program to test MIDI output.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//*****************************************//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <iostream>
							 | 
						||
| 
								 | 
							
								#include <cstdlib>
							 | 
						||
| 
								 | 
							
								#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
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// 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( RtMidiOut *rtmidi );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int main( void )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  RtMidiOut *midiout = 0;
							 | 
						||
| 
								 | 
							
								  std::vector<unsigned char> message;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // RtMidiOut constructor
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    midiout = new RtMidiOut();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  catch ( RtMidiError &error ) {
							 | 
						||
| 
								 | 
							
								    error.printMessage();
							 | 
						||
| 
								 | 
							
								    exit( EXIT_FAILURE );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Call function to select port.
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    if ( chooseMidiPort( midiout ) == false ) goto cleanup;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  catch ( RtMidiError &error ) {
							 | 
						||
| 
								 | 
							
								    error.printMessage();
							 | 
						||
| 
								 | 
							
								    goto cleanup;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Send out a series of MIDI messages.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Program change: 192, 5
							 | 
						||
| 
								 | 
							
								  message.push_back( 192 );
							 | 
						||
| 
								 | 
							
								  message.push_back( 5 );
							 | 
						||
| 
								 | 
							
								  midiout->sendMessage( &message );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  SLEEP( 500 );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  message[0] = 0xF1;
							 | 
						||
| 
								 | 
							
								  message[1] = 60;
							 | 
						||
| 
								 | 
							
								  midiout->sendMessage( &message );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Control Change: 176, 7, 100 (volume)
							 | 
						||
| 
								 | 
							
								  message[0] = 176;
							 | 
						||
| 
								 | 
							
								  message[1] = 7;
							 | 
						||
| 
								 | 
							
								  message.push_back( 100 );
							 | 
						||
| 
								 | 
							
								  midiout->sendMessage( &message );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Note On: 144, 64, 90
							 | 
						||
| 
								 | 
							
								  message[0] = 144;
							 | 
						||
| 
								 | 
							
								  message[1] = 64;
							 | 
						||
| 
								 | 
							
								  message[2] = 90;
							 | 
						||
| 
								 | 
							
								  midiout->sendMessage( &message );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  SLEEP( 500 );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Note Off: 128, 64, 40
							 | 
						||
| 
								 | 
							
								  message[0] = 128;
							 | 
						||
| 
								 | 
							
								  message[1] = 64;
							 | 
						||
| 
								 | 
							
								  message[2] = 40;
							 | 
						||
| 
								 | 
							
								  midiout->sendMessage( &message );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  SLEEP( 500 );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Control Change: 176, 7, 40
							 | 
						||
| 
								 | 
							
								  message[0] = 176;
							 | 
						||
| 
								 | 
							
								  message[1] = 7;
							 | 
						||
| 
								 | 
							
								  message[2] = 40;
							 | 
						||
| 
								 | 
							
								  midiout->sendMessage( &message );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  SLEEP( 500 );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Sysex: 240, 67, 4, 3, 2, 247
							 | 
						||
| 
								 | 
							
								  message[0] = 240;
							 | 
						||
| 
								 | 
							
								  message[1] = 67;
							 | 
						||
| 
								 | 
							
								  message[2] = 4;
							 | 
						||
| 
								 | 
							
								  message.push_back( 3 );
							 | 
						||
| 
								 | 
							
								  message.push_back( 2 );
							 | 
						||
| 
								 | 
							
								  message.push_back( 247 );
							 | 
						||
| 
								 | 
							
								  midiout->sendMessage( &message );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Clean up
							 | 
						||
| 
								 | 
							
								 cleanup:
							 | 
						||
| 
								 | 
							
								  delete midiout;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool chooseMidiPort( RtMidiOut *rtmidi )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  std::cout << "\nWould you like to open a virtual output 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 output 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 << "  Output port #" << i << ": " << portName << '\n';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    do {
							 | 
						||
| 
								 | 
							
								      std::cout << "\nChoose a port number: ";
							 | 
						||
| 
								 | 
							
								      std::cin >> i;
							 | 
						||
| 
								 | 
							
								    } while ( i >= nPorts );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  std::cout << "\n";
							 | 
						||
| 
								 | 
							
								  rtmidi->openPort( i );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return true;
							 | 
						||
| 
								 | 
							
								}
							 |