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