//*****************************************// // midiout.cpp // by Gary Scavone, 2003-2004. // // Simple program to test MIDI output. // //*****************************************// #include #include #include "RtMidi.h" // Platform-dependent sleep routines. #if defined(__WINDOWS_MM__) #include #define SLEEP( milliseconds ) Sleep( (DWORD) milliseconds ) #else // Unix variants #include #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( int argc, char *argv[] ) { RtMidiOut *midiout = 0; std::vector message; // RtMidiOut constructor try { midiout = new RtMidiOut(); } catch ( RtError &error ) { error.printMessage(); exit( EXIT_FAILURE ); } // Call function to select port. try { if ( chooseMidiPort( midiout ) == false ) goto cleanup; } catch ( RtError &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; igetPortName(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; }