midiout.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. //*****************************************//
  2. // midiout.cpp
  3. // by Gary Scavone, 2003-2004.
  4. //
  5. // Simple program to test MIDI output.
  6. //
  7. //*****************************************//
  8. #include <iostream>
  9. #include "RtMidi.h"
  10. // Platform-dependent sleep routines.
  11. #if defined(__WINDOWS_MM__)
  12. #include <windows.h>
  13. #define SLEEP( milliseconds ) Sleep( (DWORD) milliseconds )
  14. #else // Unix variants
  15. #include <unistd.h>
  16. #define SLEEP( milliseconds ) usleep( (unsigned long) (milliseconds * 1000.0) )
  17. #endif
  18. // This function should be embedded in a try/catch block in case of
  19. // an exception. It offers the user a choice of MIDI ports to open.
  20. // It returns false if there are no ports available.
  21. bool chooseMidiPort( RtMidi *rtmidi );
  22. int main(int argc, char *argv[])
  23. {
  24. RtMidiOut *midiout = 0;
  25. std::vector<unsigned char> message;
  26. // RtMidiOut constructor
  27. try {
  28. midiout = new RtMidiOut();
  29. }
  30. catch (RtError &error) {
  31. error.printMessage();
  32. exit(EXIT_FAILURE);
  33. }
  34. // Call function to select port.
  35. try {
  36. if ( chooseMidiPort( midiout ) == false ) goto cleanup;
  37. }
  38. catch (RtError &error) {
  39. error.printMessage();
  40. goto cleanup;
  41. }
  42. // Send out a series of MIDI messages.
  43. // Program change: 192, 5
  44. message.push_back( 192 );
  45. message.push_back( 5 );
  46. midiout->sendMessage( &message );
  47. // Control Change: 176, 7, 100 (volume)
  48. message[0] = 176;
  49. message[1] = 7;
  50. message.push_back( 100 );
  51. midiout->sendMessage( &message );
  52. // Note On: 144, 64, 90
  53. message[0] = 144;
  54. message[1] = 64;
  55. message[2] = 90;
  56. midiout->sendMessage( &message );
  57. SLEEP( 500 );
  58. // Note Off: 128, 64, 40
  59. message[0] = 128;
  60. message[1] = 64;
  61. message[2] = 40;
  62. midiout->sendMessage( &message );
  63. // Sysex: 240, 67, 16, 4, 3, 2, 247
  64. message[0] = 240;
  65. message[1] = 67;
  66. message[2] = 4;
  67. message.push_back( 3 );
  68. message.push_back( 2 );
  69. message.push_back( 247 );
  70. midiout->sendMessage( &message );
  71. // Clean up
  72. cleanup:
  73. delete midiout;
  74. return 0;
  75. }
  76. bool chooseMidiPort( RtMidi *rtmidi )
  77. {
  78. bool isInput = false;
  79. if ( typeid( *rtmidi ) == typeid( RtMidiIn ) )
  80. isInput = true;
  81. if ( isInput )
  82. std::cout << "\nWould you like to open a virtual input port? [y/N] ";
  83. else
  84. std::cout << "\nWould you like to open a virtual output port? [y/N] ";
  85. std::string keyHit;
  86. std::getline( std::cin, keyHit );
  87. if ( keyHit == "y" ) {
  88. rtmidi->openVirtualPort();
  89. return true;
  90. }
  91. std::string portName;
  92. unsigned int i = 0, nPorts = rtmidi->getPortCount();
  93. if ( nPorts == 0 ) {
  94. if ( isInput )
  95. std::cout << "No input ports available!" << std::endl;
  96. else
  97. std::cout << "No output ports available!" << std::endl;
  98. return false;
  99. }
  100. if ( nPorts == 1 ) {
  101. std::cout << "\nOpening " << rtmidi->getPortName() << std::endl;
  102. }
  103. else {
  104. for ( i=0; i<nPorts; i++ ) {
  105. portName = rtmidi->getPortName(i);
  106. if ( isInput )
  107. std::cout << " Input port #" << i << ": " << portName << '\n';
  108. else
  109. std::cout << " Output port #" << i << ": " << portName << '\n';
  110. }
  111. do {
  112. std::cout << "\nChoose a port number: ";
  113. std::cin >> i;
  114. } while ( i >= nPorts );
  115. }
  116. std::cout << "\n";
  117. rtmidi->openPort( i );
  118. return true;
  119. }