sysextest.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. //*****************************************//
  2. // sysextest.cpp
  3. // by Gary Scavone, 2003-2005.
  4. //
  5. // Simple program to test MIDI sysex sending and receiving.
  6. //
  7. //*****************************************//
  8. #include <iostream>
  9. #include <cstdlib>
  10. #include <typeinfo>
  11. #include "RtMidi.h"
  12. void usage( void ) {
  13. std::cout << "\nuseage: sysextest N\n";
  14. std::cout << " where N = length of sysex message to send / receive.\n\n";
  15. exit( 0 );
  16. }
  17. // Platform-dependent sleep routines.
  18. #if defined(__WINDOWS_MM__)
  19. #include <windows.h>
  20. #define SLEEP( milliseconds ) Sleep( (DWORD) milliseconds )
  21. #else // Unix variants
  22. #include <unistd.h>
  23. #define SLEEP( milliseconds ) usleep( (unsigned long) (milliseconds * 1000.0) )
  24. #endif
  25. // This function should be embedded in a try/catch block in case of
  26. // an exception. It offers the user a choice of MIDI ports to open.
  27. // It returns false if there are no ports available.
  28. bool chooseMidiPort( RtMidi *rtmidi );
  29. void mycallback( double deltatime, std::vector< unsigned char > *message, void * /*userData*/ )
  30. {
  31. unsigned int nBytes = message->size();
  32. for ( unsigned int i=0; i<nBytes; i++ )
  33. std::cout << "Byte " << i << " = " << (int)message->at(i) << ", ";
  34. if ( nBytes > 0 )
  35. std::cout << "stamp = " << deltatime << std::endl;
  36. }
  37. int main( int argc, char *argv[] )
  38. {
  39. RtMidiOut *midiout = 0;
  40. RtMidiIn *midiin = 0;
  41. std::vector<unsigned char> message;
  42. unsigned int i, nBytes;
  43. // Minimal command-line check.
  44. if ( argc != 2 ) usage();
  45. nBytes = (unsigned int) atoi( argv[1] );
  46. // RtMidiOut and RtMidiIn constructors
  47. try {
  48. midiout = new RtMidiOut();
  49. midiin = new RtMidiIn();
  50. }
  51. catch ( RtMidiError &error ) {
  52. error.printMessage();
  53. goto cleanup;
  54. }
  55. // Don't ignore sysex, timing, or active sensing messages.
  56. midiin->ignoreTypes( false, true, true );
  57. try {
  58. if ( chooseMidiPort( midiin ) == false ) goto cleanup;
  59. if ( chooseMidiPort( midiout ) == false ) goto cleanup;
  60. }
  61. catch ( RtMidiError &error ) {
  62. error.printMessage();
  63. goto cleanup;
  64. }
  65. midiin->setCallback( &mycallback );
  66. message.push_back( 0xF6 );
  67. midiout->sendMessage( &message );
  68. SLEEP( 500 ); // pause a little
  69. // Create a long sysex message of numbered bytes and send it out ... twice.
  70. for ( int n=0; n<2; n++ ) {
  71. message.clear();
  72. message.push_back( 240 );
  73. for ( i=0; i<nBytes; i++ )
  74. message.push_back( i % 128 );
  75. message.push_back( 247 );
  76. midiout->sendMessage( &message );
  77. SLEEP( 500 ); // pause a little
  78. }
  79. // Clean up
  80. cleanup:
  81. delete midiout;
  82. delete midiin;
  83. return 0;
  84. }
  85. bool chooseMidiPort( RtMidi *rtmidi )
  86. {
  87. bool isInput = false;
  88. if ( typeid( *rtmidi ) == typeid( RtMidiIn ) )
  89. isInput = true;
  90. if ( isInput )
  91. std::cout << "\nWould you like to open a virtual input port? [y/N] ";
  92. else
  93. std::cout << "\nWould you like to open a virtual output port? [y/N] ";
  94. std::string keyHit;
  95. std::getline( std::cin, keyHit );
  96. if ( keyHit == "y" ) {
  97. rtmidi->openVirtualPort();
  98. return true;
  99. }
  100. std::string portName;
  101. unsigned int i = 0, nPorts = rtmidi->getPortCount();
  102. if ( nPorts == 0 ) {
  103. if ( isInput )
  104. std::cout << "No input ports available!" << std::endl;
  105. else
  106. std::cout << "No output ports available!" << std::endl;
  107. return false;
  108. }
  109. if ( nPorts == 1 ) {
  110. std::cout << "\nOpening " << rtmidi->getPortName() << std::endl;
  111. }
  112. else {
  113. for ( i=0; i<nPorts; i++ ) {
  114. portName = rtmidi->getPortName(i);
  115. if ( isInput )
  116. std::cout << " Input port #" << i << ": " << portName << '\n';
  117. else
  118. std::cout << " Output port #" << i << ": " << portName << '\n';
  119. }
  120. do {
  121. std::cout << "\nChoose a port number: ";
  122. std::cin >> i;
  123. } while ( i >= nPorts );
  124. }
  125. std::cout << std::endl;
  126. rtmidi->openPort( i );
  127. return true;
  128. }