|
@@ -26,11 +26,6 @@ void usage( void ) {
|
|
|
#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( RtMidi *rtmidi );
|
|
|
-
|
|
|
void mycallback( double deltatime, std::vector< unsigned char > *message, void *userData )
|
|
|
{
|
|
|
unsigned int nBytes = message->size();
|
|
@@ -64,10 +59,9 @@ int main( int argc, char *argv[] )
|
|
|
// Don't ignore sysex, timing, or active sensing messages.
|
|
|
midiin->ignoreTypes( false, true, true );
|
|
|
|
|
|
- // Call function to select ports
|
|
|
try {
|
|
|
- if ( chooseMidiPort( midiin ) == false ) goto cleanup;
|
|
|
- if ( chooseMidiPort( midiout ) == false ) goto cleanup;
|
|
|
+ midiin->openVirtualPort( "MyVirtualInputPort" );
|
|
|
+ midiout->openPort( 0 );
|
|
|
}
|
|
|
catch ( RtMidiError &error ) {
|
|
|
error.printMessage();
|
|
@@ -80,18 +74,17 @@ int main( int argc, char *argv[] )
|
|
|
midiout->sendMessage( &message );
|
|
|
SLEEP( 500 ); // pause a little
|
|
|
|
|
|
- // Create a long sysex message of numbered bytes and send it out.
|
|
|
+ // Create a long sysex message of numbered bytes and send it out ... twice.
|
|
|
for ( int n=0; n<2; n++ ) {
|
|
|
- message.clear();
|
|
|
- message.push_back( 240 );
|
|
|
- for ( i=0; i<nBytes; i++ )
|
|
|
- message.push_back( i % 128 );
|
|
|
- message.push_back( 247 );
|
|
|
- midiout->sendMessage( &message );
|
|
|
-
|
|
|
- SLEEP( 500 ); // pause a little
|
|
|
-
|
|
|
-}
|
|
|
+ message.clear();
|
|
|
+ message.push_back( 240 );
|
|
|
+ for ( i=0; i<nBytes; i++ )
|
|
|
+ message.push_back( i % 128 );
|
|
|
+ message.push_back( 247 );
|
|
|
+ midiout->sendMessage( &message );
|
|
|
+
|
|
|
+ SLEEP( 500 ); // pause a little
|
|
|
+ }
|
|
|
|
|
|
// Clean up
|
|
|
cleanup:
|
|
@@ -100,55 +93,3 @@ int main( int argc, char *argv[] )
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
-
|
|
|
-bool chooseMidiPort( RtMidi *rtmidi )
|
|
|
-{
|
|
|
- bool isInput = false;
|
|
|
- if ( typeid( *rtmidi ) == typeid( RtMidiIn ) )
|
|
|
- isInput = true;
|
|
|
-
|
|
|
- if ( isInput )
|
|
|
- std::cout << "\nWould you like to open a virtual input port? [y/N] ";
|
|
|
- else
|
|
|
- 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 ) {
|
|
|
- if ( isInput )
|
|
|
- std::cout << "No input ports available!" << std::endl;
|
|
|
- else
|
|
|
- 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);
|
|
|
- if ( isInput )
|
|
|
- std::cout << " Input port #" << i << ": " << portName << '\n';
|
|
|
- else
|
|
|
- std::cout << " Output port #" << i << ": " << portName << '\n';
|
|
|
- }
|
|
|
-
|
|
|
- do {
|
|
|
- std::cout << "\nChoose a port number: ";
|
|
|
- std::cin >> i;
|
|
|
- } while ( i >= nPorts );
|
|
|
- }
|
|
|
-
|
|
|
- std::cout << std::endl;
|
|
|
- rtmidi->openPort( i );
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|